例题: 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; }