hdu1325

版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/82842861

http://acm.hdu.edu.cn/showproblem.php?pid=1325

注意的点:

1. 有向数  只有一个根

2. 不能成环

3. 除了根每个结点的入度都为1

4.****输入不是以-1 -1 结束  而是<0   否则会T

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e3 + 5;
const int M = 5e5 + 5;

int fa[N],sign[N],in[N];
int root;
bool flag;

int Find(int k){

    if(k != fa[k])
        fa[k] = Find(fa[k]);

    return fa[k];
}

void Merge(int x,int y){

    int dx = Find(x);
    int dy = Find(y);

    if(dx != dy){

        fa[dx] = dy;
        sign[dx] = 0;
        sign[dy] = 1;
    }

}
int main()
{

    int a, b;
    int cnt = 0;
    while(scanf("%d%d",&a,&b) && a > 0 && b > 0){


        for(int i = 0;i < N;i ++){

            sign[i] = 0;
            fa[i] = i;
            in[i] = 0;
        }
        root = 0;
        flag = true;
        Merge(a,b);
        in[b] ++;
        while(scanf("%d%d",&a,&b)&&a && b){

            Merge(a,b);
            in[b] ++;
        }
        for(int i = 0;i < N;i ++){

            if(in[i] > 1)
                flag = false;
            if(sign[i])
                root ++;
        }
        if(root > 1)
            flag = false;

        if(flag)
            cout<<"Case "<<++cnt<<" is a tree."<<endl;
        else
            cout<<"Case "<<++cnt<<" is not a tree."<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Soul_97/article/details/82842861