好友推荐

import java.util.*;
public class Main{
 public static void main(String[] args){
  Scanner scan = new Scanner(System.in);
  while(scan.hasNext()){
   int p = scan.nextInt();//好友推荐阈值;
   int m = scan.nextInt();//用户数量
   int M = scan.nextInt();//增加指定两个用户之间的好友关系数量
   int n = scan.nextInt();//查询某个用户的好友数量n
   int N = scan.nextInt();//查询指定两个用户是否是好友N字符串
   scan.nextLine();
   //用户姓名 m个
   String[] user_name = new String[m];
   for(int i = 0 ; i < m ; i++){
    user_name[i] = scan.nextLine();
   }
   //用户关系 M条
   Map<String , HashSet<String>> map = new HashMap<String , HashSet<String>>();
   for(int i = 0 ; i < m ; i++){
    HashSet<String> set = new HashSet<String>();
    map.put(user_name[i], set);
   }
   //添加关系
   for(int i = 0 ; i < M ; i++){
    String[] relation = scan.nextLine().split(" ");
    map.get(relation[0]).add(relation[1]);
    map.get(relation[1]).add(relation[0]);
   } 
   //如果用户A和用户B不是好友,当两人共同好友数量超过阈值P时,推荐为彼此好友
   recommendedFriend(p , m , user_name ,map);
   //查询某个用户的好友数量
   String[] query = new String[n];
   for(int i = 0 ; i < n ; i++){
    query[i] = scan.nextLine();
   }
   //打印指定用户好友数量
   printNumberOfFriend(query , n , map);   
   //查询指定两个用户是否是好友
   String[] isFriend = new String[N];
   for(int i = 0 ; i < N ; i++){    
    isFriend[i] = scan.nextLine();
   }   
   queryIsFriend(isFriend , N , map);
  }
  scan.close();
 }
 private static void queryIsFriend(String[] isFriend , int N , Map<String , HashSet<String>> map){
  String[] judge_relation = new String[2];
  for(int i = 0 ; i < N ; i++){
   judge_relation = isFriend[i].split(" ");
   if(map.get(judge_relation[0]).contains(judge_relation[1])){
    System.out.println("0");
   }else{
    System.out.println("-1");
   }
  }
 }
 private static void printNumberOfFriend(String[] query , int n ,Map<String , HashSet<String>> map){
  for(int i = 0 ; i < n ; i++){
   //如果用户存在
   if(map.containsKey(query[i])){
    System.out.println(map.get(query[i]).size());
   }else{
    System.out.println("-1");
   }   
  }
 }
 private static void recommendedFriend(int p , int m , String[] user_name ,Map<String , HashSet<String>> map){
  //尝试给m个用户推荐好友
  //1.本身不是好友 2.好友数量达到阈值
  int count = 0;//统计共同好友的个数
  for(int i = 0 ; i < m - 1 ; i++){
   for(int j = i + 1 ; j < m ; j++){
    //彼此不是对方的好友
    if(map.get(user_name[i]).contains(user_name[j])){
     continue;
    }else{
     for(int k = 0 ; k < m ; k++){
      if(map.get(user_name[i]).contains(user_name[k]) && map.get(user_name[j]).contains(user_name[k])){
       count++;
      }
     }
     //如果共同好友数量大于阈值,推荐为彼此好友
     if(count >= p){
      map.get(user_name[i]).add(user_name[j]);
      map.get(user_name[j]).add(user_name[i]);
     }
    }
   }
  }
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值