题目链接:http://vjudge.net/problem/viewProblem.action?id=20432
题目大意:朋友的朋友是朋友,求人数最多的那帮家伙有多少人。
我刚开始真尝试了一遍的一步一步用数组模拟搜索,拼接······,果断超时了,下次不干那么无聊的事了,明明有好算法,干嘛还暴力呢?
这是基本的并查集的题目,参考代码如下:
#include <stdio.h> int fa[30001],tot[30001]; int find(int u) { fa[u]==u?u:fa[u]=find(fa[u]); return fa[u]; } int main() { int t,n,m,i,x,y,u,v,maxx; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); for (i=1;i<=n;i++) {fa[i]=i,tot[i]=0;} for (i=1;i<=m;i++) { scanf("%d%d",&u,&v); x=find(u);y=find(v); if (x!=y) fa[x]=y; } for (i=1;i<=n;i++) tot[find(i)]++; maxx=tot[1]; for (i=2;i<=n;i++) if (tot[i]>maxx) maxx=tot[i]; printf("%d\n",maxx); } return 0; }
以下是我的暴力求解,仅供参考
每输入一次,分别在每一组中搜索有没有与其相等的数,如果只有一个数在其中一组已存在,那么把另一个数添加到这组;
如果两个数在不同的两组搜索到,那么就把两组连接上;如果两个数在同一组出现,不用操作。
#include<stdio.h> #include <string.h> int f[12000][30000],h[12000]; int main() { int t,n,m,a,b,num=0,k,i,j; scanf("%d",&t); while (t--) { num=0; scanf("%d%d",&n,&m); scanf("%d%d",&a,&b); memset(h,0,sizeof(h)); f[0][h[0]++]=a;f[0][h[0]++]=b;num++;m--; while(m--) { scanf("%d%d",&a,&b); int x[2],y=0; for (i=0;i<num;i++) { k=0; int s=h[i]; for (j=0;j<s;j++) { if (a==f[i][j]) {k++;f[i][h[i]++]=b;} if (b==f[i][j]) {k++;f[i][h[i]++]=a;} if (k==2) break; } if (k==2) { h[i]-=2; y=3; break; } else if (k==1) x[y++]=i; if (y==2)break; } if (y==0) { f[num][h[num]++]=a; f[num][h[num]++]=b; num++; } else if (y==2) { h[x[0]]--; for(i=0;i<h[x[1]]-1;i++) f[x[0]][h[x[0]]++]=f[x[1]][i]; memset(f[x[1]],0,sizeof(f[x[1]])); } } int max1=h[0]; for (i=0;i<num;i++); if (h[i]>max1) max1=h[i]; printf("%d\n",max1); } return 0; }
UVA 10608 Friends 并查集,布布扣,bubuko.com
原文地址:http://blog.csdn.net/yzj577/article/details/38259907