例题: poj 1308
题目大意比较简单,对任意两个点,有且仅有一条道路,也就是一棵树。
题解:一棵树中,肯定是不能有环的,而且只能由一个根节点。(没认真读题,只知道在那里判环。。。。),所以这个题先判环然后就是判根节点的唯一性。
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+7;
int fa[N];
bool mark[N];
int find(int x){
return fa[x]==x? x:fa[x]=find(fa[x]);
}
bool unite(int x,int y){
x=find(x);y=find(y);
if(x==y) return 1;
else {
fa[x]=y;
return 0;
}
}
int main(){
int n,m,time=0;
while(cin>>n>>m){
if(n==-1&&m==-1) break;
for(int i=0;i<=100000;i++) {
fa[i]=i;mark[i]=0;
}
if(n==0&&m==0) {
printf("Case %d ",++time);
cout<<"is a tree."<<endl;
continue ;
}
mark[n]=mark[m]=1;
bool flag=0;
if(unite(n,m)) flag=1;
while(cin>>n>>m,n||m){
mark[n]=mark[m]=1;
if(unite(n,m)) flag=1;
}
printf("Case %d ",++time);
if(flag) cout<<"is not a tree."<<endl;
else{
int tmp=0;
for(int i=1;i<=100000;i++){
if(mark[i]&&find(i)==i) tmp++;
}
if(tmp!=1) cout<<"is not a tree."<<endl;
else cout<<"is a tree."<<endl;
}
}
return 0;
}
来源:https://www.cnblogs.com/Accepting/p/12658337.html