UVA 10608 Friends 并查集

来源:互联网 发布:qemu仿真linux靠谱不 编辑:程序博客网 时间:2024/05/16 19:41

题目链接: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;}




0 0
原创粉丝点击