Friends

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3710

题意:有N个人,M对关系,(a,b)表示a,b互相认识。如果两个不认识的人有不小于K个共同朋友,则这两个人将成为新的朋友。问有多少对能成为新的好朋友。

思路:枚举所有的人,如果两个人不是朋友的话,就通过两个人共同好友个数判断两个人能否成为朋友,如果两个人成为新朋友则需要重新判断没有成为朋友的人,直至没有新的朋友产生。

 1 #include <stdio.h>
 2 #include <string.h>
 3 using namespace std;
 4 
 5 const int N=120;
 6 int m[N][N];
 7 int main()
 8 {
 9     int t;
10     scanf("%d",&t);
11     while(t--)
12     {
13         int N,M,K;
14         scanf("%d%d%d",&N,&M,&K);
15         memset(m,0,sizeof(m));
16         int u,v;
17         for (int i = 0; i < M; i++)
18         {
19             scanf("%d%d",&u,&v);
20             m[u][v] = 1; //u,v两个人是朋友
21             m[v][u] = 1;
22         }
23         int ans = 0;
24         int flag = 0;
25         while(1)
26         {
27             flag = 0;
28             for (int i = 0; i < N; i++)
29             {
30                 for (int j = 0; j < N; j++)
31                 {
32                     if(i==j) continue;
33                     if (m[i][j]==0)//如果两个人不是朋友
34                     {
35                         int cnt = 0;
36                         int k;
37                         for (k = 0; k < N; k ++)
38                         {
39                             if (m[i][k]==1&&m[j][k]==1)
40                                 cnt++; //统计两个人共同的朋友个数
41                             if (cnt >= K)
42                             {
43                                 flag = 1;
44                                 m[i][j] = 1;
45                                 m[j][i] = 1;
46                                 ans++;
47                                 break;
48                             }
49                         }
50                     }
51                 }
52             }
53             if(!flag)//没有新朋友产生
54                 break;
55         }
56         printf("%d
",ans);
57     }
58     return 0;
59 }
View Code
原文地址:https://www.cnblogs.com/lahblogs/p/3587075.html