题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3710
Alice lives in the country where people like to make friends. The friendship is bidirectional and if any two person have no less than k friends in common, they will become
friends in several days. Currently, there are totally n people in the country, and m friendship among them. Assume that any new friendship is made only when they have sufficient friends in common mentioned above, you are to tell how many
new friendship are made after a sufficiently long time.
Input
There are multiple test cases.
The first lien of the input contains an integer T (about 100) indicating the number of test cases. Then T cases follow. For each case, the first line contains three
integersn, m, k (1 ≤ n ≤ 100, 0 ≤ m ≤ n×(n-1)/2, 0 ≤ k ≤ n, there will be no duplicated friendship) followed by m lines showing the current friendship. The ith friendship
contains two integers ui, vi (0 ≤ ui, vi < n, ui ≠ vi) indicating there is friendship between person ui and vi.
Note: The edges in test data are generated randomly.
Output
For each case, print one line containing the answer.
Sample Input
3 4 4 2 0 1 0 2 1 3 2 3 5 5 2 0 1 1 2 2 3 3 4 4 0 5 6 2 0 1 1 2 2 3 3 4 4 0 2 0
Sample Output
2 0 4
Author: ZHUANG, Junyuan
Contest: The 10th Zhejiang Provincial Collegiate Programming Contest
题意:
有 n 个人,其中一些人是朋友,如果某两个不是朋友的人之间满足有 k 个共同的朋友,那么这两个人也可认为是朋友,
给出 m 个初始关系,问最后会有多少个通过共同朋友而成为朋友的生成关系。
PS:
枚举两个不同的人(不是朋友)组合,遍历第三者,如果与两人都有朋友关系的人足够多(>=k),就添加关系并计数。
这样的遍历要一直走,直到遍历一次不生成新的关系为止。
代码如下:
#include <stdio.h> #include <cstring> int map[147][147]; int main() { int t; scanf("%d",&t); while(t--) { int a, b; int i, j, h; int n, m, k; memset(map,0,sizeof(map)); scanf("%d%d%d",&n,&m,&k); for(i = 1; i <= m; i++) { scanf("%d%d",&a,&b); map[a][b] = 1; map[b][a] = 1; } int ans = 0; for(int f = 0; ; f++) { int flag = 0; for(i = 0; i < n; i++) { for(j = i+1; j < n; j++) { if(map[i][j]) { continue; } int cont = 0; for(h = 0; h < n; h++) { if(map[i][h] && map[j][h]) { cont++; } } if(cont >= k) { flag = 1; //printf(" %d %d\n",i,j); map[i][j] = 1;//xin peng you map[j][i] = 1; ans++; } } } if(flag == 0) { break; } } printf("%d\n",ans); } return 0; }