版权声明:转就转吧~~记得声明噢~~ 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;
}