zoj 3710 Friends

发布时间:2014-10-23 23:22:39
来源:分享查询网

Friends   Time Limit: 2 Seconds      Memory Limit: 65536 KB 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 integers n, 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 看题目就能发现要用暴力: 时间:2S; 数据范围:1<=n<=100;   #include<stdio.h> #include<math.h> #include<string.h> #define N 105 int G[N][N]; int n,m,K; int main() { int T,i,j,k,ans; scanf("%d",&T); while(T--) { ans=0; scanf("%d%d%d",&n,&m,&K); memset(G,0,sizeof(G)); //数组初始化 for(i=0;i<n;i++) G[i][i]=1; //自己和自己是朋友 while(m--) { scanf("%d%d",&i,&j); G[i][j]=1; G[j][i]=1; } while(1) { int cnt,flag=0; for(i=0;i<n;i++) //从0开始寻找和它不是朋友的元素 { for(j=0;j<n;j++) if(!G[i][j]) //i和j不是朋友 { cnt=0; for(k=0;k<n;k++) //寻找i和j公共朋友的个数 if(G[j][k]&&G[i][k]) cnt++; if(cnt>=K) { G[j][i]=1; G[i][j]=1; ans++; flag=1; } } } if(flag==0) break; } printf("%d\n",ans); } return 0; }

返回顶部
查看电脑版