kuangbin专题五 并查集 HDU1272 小希的迷宫

来源:互联网 发布:insert mysql自增 编辑:程序博客网 时间:2024/05/21 14:50

题意:
中文题
题解:
任意两个房间有且仅有一条路径可以相通,可以用并查集来做,如果输入的两个房间号的祖宗是一样的话,就说明,成环了,输出No,还有一种情况是不成环,森林的情况,比如:
1 2 3 4 0 0
正确的输出为No。
只要在最后跑一边for循环检查是否出现两个祖宗就可以知道是否出现森林了。

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int MAXN=1e5+7;int f[MAXN];bool vis[MAXN];void init(){    for(int i=0;i<=1e5;i++)    f[i]=i;}int find(int p){    while(p!=f[p])    {        f[p]=f[f[p]];        p=f[p];    }    return p;}bool Union(int p,int q){    int P=find(p);    int Q=find(q);    if(P==Q)    return true;    else    {        f[Q]=P;    }    return false;}int main() {    int n;    while(1)    {        int a,b,MAX=0;        init();         memset(vis,false,sizeof(vis));        bool mark=false,ans=false;        while(~scanf("%d%d",&a,&b))        {            if(a==-1&&b==-1)            {                mark=true;                break;            }            MAX=max(max(MAX,a),b);            vis[a]=true;            vis[b]=true;            if(a==0&&b==0)            break;            if(Union(a,b))            ans=true;        }        int sum=0;        for(int i=1;i<=MAX;i++)        if(vis[i]&&f[i]==i)        sum++;        if(mark)        break;        if(ans||sum>1)        printf("No\n");        else        printf("Yes\n");    }}
原创粉丝点击