F - Friends ZOJ - 3710(暴力)
题目链接:https://cn.vjudge.net/contest/280949#problem/F
题目大意:给你n个人,然后给你m个关系,每个关系输入t1, t2 .代表t1和t2是朋友关系(双向关系)。然后输入一个k,代表两个人是亲密的朋友关系的话,就至少有k个共同的朋友,然后问你题目中这样的朋友有多少对?
具体思路:注意一个地方,朋友关系具有传递性,打个比方 t1和t2 变成了亲密的朋友,然后t0 本来和t1是朋友关系,但是和t2不是朋友关系,t1和t2成为朋友之后,t0也就和t2称为朋友了。
(读题还是太慢了。。。。)
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define inf 0x3f3f3f3f 4 const int maxn = 100+100; 5 int vis[maxn][maxn]; 6 int n,m,k; 7 bool cal(int t1,int t2) 8 { 9 int num=0; 10 for(int i=1; i<=n; i++) 11 { 12 if(vis[t1][i]&&vis[t2][i]) 13 { 14 num++; 15 } 16 } 17 if(num<k) 18 return false; 19 // cout<<t1<<" "<<t2<<endl; 20 return true; 21 } 22 int main() 23 { 24 int T; 25 scanf("%d",&T); 26 while(T--) 27 { 28 memset(vis,0,sizeof(vis)); 29 int t1,t2; 30 scanf("%d %d %d",&n,&m,&k); 31 for(int i=1; i<=m; i++) 32 { 33 scanf("%d %d",&t1,&t2); 34 t1++; 35 t2++; 36 vis[t1][t2]=1; 37 vis[t2][t1]=1; 38 } 39 int flag=1; 40 int num=0; 41 while(flag)//不能一次循环就完事了,还会有经过传递之后成为新朋友的关系。 42 { 43 int ans=0; 44 flag=0; 45 for(int i=1; i<=n; i++) 46 { 47 for(int j=i+1; j<=n; j++) 48 { 49 if(vis[i][j]) 50 continue; 51 if(cal(i,j)) 52 { 53 vis[i][j]=vis[j][i]=1; 54 ans++; 55 flag=1; 56 } 57 } 58 } 59 num+=ans; 60 } 61 printf("%d\n",num); 62 } 63 return 0; 64 }