http://ac.jobdu.com/problem.php?pid=1481
最开始的版本
只考虑到了,每个节点至多有一个父节点(至多有一个入度),最多有一个根。而忽略了有环,可空树的情况。
参考了
1.http://www.cnblogs.com/newpanderking/archive/2012/10/14/2723260.html
后
*使用并查集来解决 唯一根,存在环,空树的情况
*使用degree[] 来解决唯一父节点
#include <stdio.h>
#include <cstring>
static int father[10005];
static int degree[10005];
static int visit[10005];
int find(int u){
return u == father[u]? u : father[u] = find(father[u]);
}
int main(){
//freopen("in/1481.in","r",stdin);
int a,b,Case=1;
bool isTree = true;
for (int i = 0; i < 10005; ++i) {
father[i] = i;
degree[i] = 0;
visit[i] = false;
}
while(scanf("%d%d",&a,&b) && !(a==-1 && b ==-1) ) {
if (a==0 && b==0) {
int nRoot = 0;
for (int i = 1; i < 10005; ++i) {
if(father[i] == i&& visit[i]) nRoot++;
if(degree[i] > 1){
isTree = false;
break;
}
}
if(nRoot > 1) isTree = false;
if(isTree) printf("Case %d is a tree.\n",Case++);
else printf("Case %d is not a tree.\n",Case++);
for (int i = 0; i < 10005; ++i) {
father[i] = i;
degree[i] = 0;
visit[i] = false;
}
isTree = true;
continue;
}
degree[b]++;
visit[a] = visit[b] = true;
if(find(a) != find(b)) father[find(b)] = find(a);
else{
//There is a loop
isTree = false;
}
}
}