标签:阈值 iter ase cal file ram ret 依次 rgs
好友关系管理 | |
描写叙述: |
现有一个社交站点,其好友推荐策略为:用户A和用户B不是好友,当二人的共同好友数量超过好友推荐阈值m时,就向A和B分别推荐为彼此好友。 本题任务为:对设定的m值。给定一组用户及各自好友列表,对这一组用户,重复自己主动应用上述好友推荐策略后(如果每次推荐都被採纳),求指定用户的终于好友列表。 注:好友关系是双向的,即:假设用户A是用户B的好友,那么用户B一定也是用户A的好友。
写一个程序,在社交网络中实现: 1)初始化社交网络 2)创建用户 3)添加指定两个用户之间的好友关系 4)重复自己主动应用好友推荐策略后。获取某个用户的好友数量 5)重复自己主动应用好友推荐策略后,推断某两个用户间是否存在好友关系
说明: 1、一个用户有且仅仅有一个名字,且不存在重名 2、自己和自己不存在好友关系 3、username字大写和小写敏感 4、username字字符串长度范围为[1..20] 5、用户总数小于100个
|
执行时间限制: | 无限制 |
内存限制: | 无限制 |
输入: |
|
输出: |
|
例子输入: |
2 3 3 3 3 //好友推荐阈值2。用户数量为3,添加知道两个用户之间的好友关系数量M, //查询某个用户的好友数量3,查询指定两个用户是否是好友N字符串 Jack Peter Tom //输入了三个用户 Jack Peter Peter Tom Jack Tom //添加了三个好友关系 Jack Peter Tom //查询了这三个用户的好友数量 Jack Peter Peter Tom Jack Tom //查询了这三个好友关系是否存在 例子输出: |
例子输出: |
2 //Jack几个好友,这里就用到了阈值 2 //Peter几个好友 2 0 //Jack Peter是否好友 0 //Peter Tom是否好友 0 //Jack Tom是否好友 |
这道题,我的思路全然错误,问题在于没有看明确阈值究竟是什么,题目中说道“用户A和用户B不是好友,当二人的共同好友数量超过好友推荐阈值m时。就向A和B分别推荐为彼此好友”,而我推断的却是两个人之间隔着几个人。
争取今晚之前实现。
2014-8-6万 8:40
事实上这个好友关系跟图非常像,邻接点在这里就是用户,边在这里就是公共好友数目。这样问题自然就迎刃而解了。另外就是当这个社交网络里面加入了新关系时。就要又一次更新一下这个社交网络里面用户之间的公共好友个数,以免新添关系导致的新好友遗落。
package hw.test; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Scanner; import java.util.Set; /** * @author 刘利娟 liulijuan132@gmail.com * @version 创建时间:2014年8月6日 下午9:05:28 类说明: */ public class Network { private Set<Userinfo> users; // 该社交网络中的全部用户 int P;// 好友推荐阈值P int m;// 创建用户数量m int M;// 添加指定两个用户之间的好友关系数量M int n;// 查询某个用户的好友数量n int N;// 查询指定两个用户是否是好友N字符串 public Network() { users = null; } public static void main(String[] args) { Network network = new Network(); network.initial(); } public void initial() { Scanner scan = new Scanner(System.in); P = scan.nextInt(); m = scan.nextInt(); M = scan.nextInt(); n = scan.nextInt(); N = scan.nextInt(); for (int i = 0; i < m; i++) {// 加入了m个用户 String uname = scan.next(); addUserinfo(new Userinfo(uname)); } for (int i = 0; i < M; i++) {// 加入了M个用户关系 String r1 = scan.next(); String r2 = scan.next(); addRelation(findByName(r1), findByName(r2)); } initialCount(); // print(); // check(); print(); int[] nn = new int[n]; // 存储好友数量 for (int i = 0; i < n; i++) {// n个用户的好友数量 String uname = scan.next(); nn[i] = findByName(uname).getFriendCount(); } int[] nN = new int[N]; for (int i = 0; i < N; i++) {// 推断这几组是否好友 String s1 = scan.next(); String s2 = scan.next(); } for (int i = 0; i < n; i++) { System.out.println(nn[i]); } for (int i = 0; i < N; i++) { System.out.println(nN[i]); } } /** * 加入用户 * * @param userinfo */ public void addUserinfo(Userinfo userinfo) { if (users == null) { users = new HashSet<Userinfo>(); } users.add(userinfo); } /** * 加入好友关系 * * @param userinfo * @param userinfo2 */ public void addRelation(Userinfo userinfo, Userinfo userinfo2) { userinfo.addFriend(new Friend(userinfo2)); userinfo2.addFriend(new Friend(userinfo)); } /** * 获取两个用户之间公共好友数目 * * @param userinfo * @param userinfo2 * @return */ public int getCommonCount(Userinfo userinfo, Userinfo userinfo2) { int count = 0; Set<Friend> friends = userinfo.getFriends(); Set<Friend> friends2 = userinfo2.getFriends(); //System.out.println(friends2+"\n"+friends); //System.out.println("-----------------------------------------------"); if (friends != null && friends != null) for (Friend friend : friends) { // System.out.println(userinfo2.getUname()+"的好友们"+friends2+"包括"+friend+":"+friends2.contains(friend)); if (friends2.contains(friend)) { count++; } } return count; } /** * 初始化好友之间的公共好友数目 */ public void initialCount() { List<Userinfo> list = new ArrayList<Userinfo>(); for (Userinfo userinfo : users) { list.add(userinfo); } int countP = 1; while (countP != 0) {//仅仅要在循环里面加入了关系都要又一次从头更新一遍 countP = 0; for (int i = 0; i < list.size() - 1; i++) { for (int j = i + 1; j < list.size(); j++) { Userinfo userinfo = list.get(i); Userinfo userinfo2 = list.get(j); int commonCount = getCommonCount(userinfo, userinfo2); //System.out.println(userinfo2.getUname() + "," // + userinfo.getUname() + "公共好友:" + commonCount); if (commonCount >= P) { if (isFriend(userinfo, userinfo2) != 0) {// 不是朋友的时候 addRelation(userinfo, userinfo2); countP++; } } } } } } /** * 依据username获取用户 * * @param uname * @return */ public Userinfo findByName(String uname) { for (Userinfo userinfo : users) { if (userinfo.getUname().equals(uname)) { return userinfo; } } return null; } /** * 推断两用户是否好友 * * @param u1 * @param u2 * @return */ public int isFriend(String u1, String u2) { return isFriend(findByName(u1), findByName(u2)); } /** * 推断两用户是否好友 * * @param userinfo * @param userinfo2 * @return */ public int isFriend(Userinfo userinfo, Userinfo userinfo2) { return userinfo.isFriend(userinfo2); } public void print() { for (Userinfo userinfo : users) { System.out.println(userinfo); } } public Set<Userinfo> getUsers() { return users; } public void setUsers(Set<Userinfo> users) { this.users = users; } } class Userinfo { // 用户,相当于节点 private String uname; // username private Set<Friend> friends; // 邻接点们 public Userinfo(String uname) { super(); this.uname = uname; friends = null; } /** * 加入好友 * * @param friend */ public void addFriend(Friend friend) { if (friends == null) { friends = new HashSet<Friend>(); } friends.add(friend); } /** * 获取好友数量 * * @return */ public int getFriendCount() { if (this.friends != null) return this.friends.size(); return -1; } /** * 当前用户与userinfo是否为好友 * * @param userinfo * @return */ public int isFriend(Userinfo userinfo) { for (Friend friend : friends) { if (friend.getUserinfo().equals(userinfo)) { return 0; } } return -1; } public Set<Friend> getFriends() { return friends; } public void setFriends(Set<Friend> friends) { this.friends = friends; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } @Override public boolean equals(Object obj) { if (!(obj instanceof Userinfo)) return false; Userinfo user = (Userinfo) obj; if (!user.getUname().equals(this.uname)) return false; return true; } @Override public int hashCode() { int length = this.uname.length(); for (int i = 0; i < this.uname.length(); i++) { char ch = this.uname.charAt(i); length = length + i * (int) ch; } return length; } @Override public String toString() { return "Userinfo [" + uname + ", " + friends + "]"; } } class Friend { private Userinfo userinfo; // 与userinfo的关系 private int count; // 公共好友个数 public Friend(Userinfo u2) { this.userinfo = u2; this.count = 0; } public Userinfo getUserinfo() { return userinfo; } public void setUserinfo(Userinfo userinfo) { this.userinfo = userinfo; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((userinfo == null) ?我的測试用比例如以下:0 : userinfo.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; Friend other = (Friend) obj; if (!userinfo.equals(other.userinfo)) return false; return true; } @Override public String toString() { return "Friend [" + userinfo.getUname() + ", " + count + "]"; } }
输出结果例如以下:
4
2
2
5
5
4
2
0
0
0
0
0
0
0
0
0
0
标签:阈值 iter ase cal file ram ret 依次 rgs
原文地址:http://www.cnblogs.com/jhcelue/p/7223950.html