hdu 1272 并查集简单题目

来源:互联网 发布:淘宝6度女装模特 编辑:程序博客网 时间:2024/05/13 05:53

题目分析:1.每两点之间有且仅有一条路径,有路径,要保证只有一个父亲结点(即所有的房间都只指向一个房间),

           仅有一条,在合并两个房间时,他们的父亲结点要不一样,如果一样说明有回路

#include<iostream>#include<cstdio>#include<algorithm>#include<memory.h>using namespace std;const int maxn=100002;int father[maxn],vis[maxn],n,m,ans,t,tmp;int Find(int x){    if(father[x]==x)return x;    return father[x]=Find(father[x]);}void Union(int x,int y){    int xx=Find(x);    int yy=Find(y);    if(xx!=yy)    {        if(xx>yy)swap(xx,yy);        father[yy]=xx;    }    if(xx==yy)//存在回路        tmp++;}int main(){    int i,j,a,b,flag=1,Max=maxn;    while(flag)    {        memset(vis,0,sizeof(vis));        for(i=1; i<=100000; i++)        {            father[i]=i;        }        tmp=0;Max=1;        while(scanf("%d%d",&a,&b),(a||b))        {            if(a==-1&&b==-1)            {                flag=0;                break;            }            vis[a]=1;            vis[b]=1;            Max=max(Max,max(a,b));            Union(a,b);        }        if(!flag)continue;        for(i=1; i<=Max; i++)        {            if(vis[i]&&father[i]==i)tmp++;        }        if(tmp<=1) printf("Yes\n");        else printf("No\n");    }    return 0;}/*6 8  1 3  5 2  6 45 6  0 08 1  7 3  6 2  8 9  7 57 4  7 8  7 6  0 03 8  6 8  6 45 3  5 6  5 2  0 0*/