ZOJ 3710 Friends(数学啊 )

来源:互联网 发布:周杰伦杭州演唱会知乎 编辑:程序博客网 时间:2024/06/05 23:50

题目链接: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 < nui ≠ 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

34 4 20 10 21 32 35 5 20 11 22 33 44 05 6 20 11 22 33 44 02 0

Sample Output

204


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 youmap[j][i] = 1;ans++;}}}if(flag == 0){break;}}printf("%d\n",ans);}return 0;}


1 0
原创粉丝点击