通信系统

题目关键就是要保证两个点

  1. 这是一张无环图
  2. 这张图是一张连通图

这就变成一个并查集的模板题,每次加进来一条边只要判断两个顶点的根节点是否相同,如果相同说明遇到了环。然后判断这张图是连通图块数是否为1。

const int N=1010;
int p[N];
int n,m;

int find(int x)
{
    if(x != p[x]) p[x]=find(p[x]);
    return p[x];
}

int main()
{
    while(cin>>n>>m,n+m)
    {
        for(int i=1;i<=n;i++) p[i]=i;

        bool ok=true;
        int cnt=n;
        while(m--)
        {
            int a,b;
            cin>>a>>b;
            int pa=find(a),pb=find(b);
            if(pa != pb)
            {
                p[pa]=pb;
                cnt--;
            }
            else ok=false;
        }

        if(ok && cnt == 1) puts("Yes");
        else puts("No");
    }
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14446350.html