好友关系管理

最近做的一道题,自己编写数据测试都对,但是提交系统后总是不对。在此贴出来,希望大家能帮我找到错误,谢谢!

好友关系管理

描述:

现有一个社交网站,其好友推荐策略为:用户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();
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值