hdu 1272 小希的迷宫

来源:互联网 发布:科赫兄弟 知乎 编辑:程序博客网 时间:2024/04/30 10:11

并查集判断给出的图是否是树

判断是否有环、未给出点数判断集合数是否大于1


判断有环:若输入两点的根相同则有环

判断所有点是否都在同一集合内:合并过程中把出现的点都标记,把最小和最大的找到,枚举在该范围内的点,看有几个根,有几个根就有几个集合。



#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn=100010;int r[maxn],n,m,T,vis[maxn],minn,maxx,flag;void init(){    for(int i=0;i<=n;i++) r[i]=i;    memset(vis,0,sizeof vis);    minn=maxn,maxx=-1,flag=1;}int root(int a){    if(r[a]==a) return a;    return r[a]=root(r[a]);}void merge(int a,int b){    int ra=root(a),rb=root(b);    if(ra!=rb) r[ra]=rb;    else flag=0;//有环}int main(){    int a,b,tmp,i;    n=maxn-5;    init();    while(~scanf("%d%d",&a,&b))    {        if(a==-1&&b==-1) break;        if(a==0&&b==0)        {            tmp=0;            for(i=minn;i<=maxx&&flag;i++)            {                if(!vis[i]) continue;                if(r[i]==i) tmp++;                if(tmp>1) flag=0;//不是连通图            }            if(!flag) printf("No\n");            else printf("Yes\n");            init();        }        else        {            merge(a,b);            minn=min(minn,a);            minn=min(minn,b);            maxx=max(maxx,a);            maxx=max(maxx,b);            vis[a]=vis[b]=1;        }    }    return 0;}


0 0
原创粉丝点击