小希的迷宫--并查集

题目

并查集可以检查这个图是否为生成树。。。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int vis[100010];
int f[100010];

int fnd(int x)
{
     int p=x,t;
     while(f[x]!=x) x=f[x];
     while(x!=p)
     {
          t=f[p];   f[p]=x;   p=t;
     }
     return p;
}
int main()
{
     int a,b;
     while(scanf("%d%d",&a,&b),a!=-1)
     {
          for(int i=1;i<=100000;i++)
               f[i]=i;
          memset(vis,0,sizeof(vis));
          int flag=0;
         // vis[a]=1;vis[b]=1;
          //f[a]=b;
          while(a!=0)
          {
               vis[a]=1;vis[b]=1;
               int fa=fnd(a),fb=fnd(b);
               if(fa==fb)  //判断是否在一棵树上。
                    flag=1;
               else
                    f[fa]=fb;
               scanf("%d%d",&a,&b);
          }
          int c=0;
          for(int i=1;i<=100000;i++)//判断是否一个连通图。。。
          {
               if(vis[i]&&f[i]==i)
               {
                    c++;
                    if(c>=2)
                    {
                         flag=1;
                         break;
                    }
               }
          }
          if(flag==1)
               printf("No\n");
          else
               printf("Yes\n");
     }
     return 0;
}

 

posted on 2016-05-18 19:52  青春的梦想付诸行动  阅读(138)  评论(0)    收藏  举报

导航