最近做的一道题,自己编写数据测试都对,但是提交系统后总是不对。在此贴出来,希望大家能帮我找到错误,谢谢!
好友关系管理 | |
描述: | 现有一个社交网站,其好友推荐策略为:用户A和用户B不是好友,当二人的共同好友数量超过好友推荐阈值m时,就向A和B分别推荐为彼此好友。 本题任务为:对设定的m值,给定一组用户及各自好友列表,对这一组用户,反复自动应用上述好友推荐策略后(假设每次推荐都被采纳),求指定用户的最终好友列表。 注:好友关系是双向的,即:如果用户A是用户B的好友,那么用户B一定也是用户A的好友。
写一个程序,在社交网络中实现: 1)初始化社交网络 2)创建用户 3)增加指定两个用户之间的好友关系 4)反复自动应用好友推荐策略后,获取某个用户的好友数量 5)反复自动应用好友推荐策略后,判断某两个用户间是否存在好友关系
说明: 1、一个用户有且只有一个名字,且不存在重名 2、自己和自己不存在好友关系 3、用户名字大小写敏感 4、用户名字字符串长度范围为[1..20] 5、用户总数小于100个
|
运行时间限制: | 无限制 |
内存限制: | 无限制 |
输入: | 五个整数,好友推荐阈值P,创建用户数量m,增加指定两个用户之间的好友关系数量M,查询某个用户的好友数量n,查询指定两个用户是否是好友N字符串,每个数据一行,按到上面的顺序依次输入数据,共m+M+n+N行字符串 字符串,每个一行,共m+M+n+N行字符串
|
输出: | 输出用户的好友数量,共n个,每个一行;如果用户不存在,输出-1,否则输出好友数量。样例中的用户Jack、Peter、Tom的好友数量都是2个。 输出指定两个用户是否是好友,共N个,每个一行,如果是输出0,否则输出-1。样例中的用户Jack与Peter、Peter与Tom、Jack与Tom都是好友关系,所有输出0。
|
样例输入: | 2 3 3 3 3 Jack Peter Tom Jack Peter Peter Tom Jack Tom Jack Peter Tom Jack Peter Peter Tom Jack Tom |
样例输出: | 2 2 2 0 0 0 |
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.Stack;
public class Main {
private Map<String, Set<String>> friends; // save the user's friends' set
private int threshold;
private Stack<String> stack;
public Main() {
this.friends = new HashMap<String, Set<String>>();
stack = new Stack<String>();
}
public void setThresHold(int threshold) {
this.threshold = threshold;
}
public void addUser(String user) {
Set<String> set = new HashSet<String>();
friends.put(user, set);
}
public void addFriend(String name1, String name2) {
Set<String> set = friends.get(name1);
set.add(name2);
set = friends.get(name2);
set.add(name1);
}
public int getFriendCount(String name) {
return friends.get(name).size();
}
public int isFriend(String name1, String name2) {
if (friends.get(name1).contains(name2)) {
return 0;
} else {
return -1;
}
}
public void recommand() {
Set<String> users = friends.keySet();
for (String str1 : users) {
operate(str1);
}
while (!stack.empty()) {
operate(stack.pop());
}
}
// public void print() {
// for (String str : friends.keySet())
// System.out.println(str + " : " + friends.get(str));
// }
public void operate(String str1) {
Set<String> set1, set2;
Set<String> tmp = new HashSet<String>();
Set<String> users = friends.keySet();
for (String str2 : users) {
set1 = friends.get(str1);
if (str1.equals(str2)) { // himself
continue;
}
if (set1.contains(str2)) { // already friends
continue;
} else { // judge if satisfy the condition of recommand
set2 = friends.get(str2);
tmp.clear();
tmp.addAll(set1);
tmp.retainAll(set2);
if (tmp.size() > threshold) {
set1.add(str2);
set2.add(str1);
stack.push(str1); // ret the changeList
stack.push(str2);
}
}
}
}
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
int[] num = new int[5];
Main test = new Main();
String name1;
String name2;
while (cin.hasNext()) {
// read five Integer
for (int i = 0; i < 5; i++) {
num[i] = cin.nextInt();
}
// set threshold
test.setThresHold(num[0]);
// init, create users
for (int i = 0; i < num[1]; i++) {
test.addUser(cin.next());
}
// create relationship;
for (int i = 0; i < num[2]; i++) {
name1 = cin.next();
name2 = cin.next();
test.addFriend(name1, name2);
}
test.recommand();
for (int i = 0; i < num[3]; i++) {
name1 = cin.next();
System.out.println(test.getFriendCount(name1));
}
for (int i = 0; i < num[4]; i++) {
name1 = cin.next();
name2 = cin.next();
System.out.println(test.isFriend(name1, name2));
}
// test.print();
}
}
}