题解 | Is It A Tree?
#include <bits/stdc++.h> using namespace std; const int MAXN=10000; int father[MAXN]; int height[MAXN]; int inDegree[MAXN]; bool visit[MAXN]; void init(int n){ for(int i=0;i<n;i++){ father[i]=i; height[i]=0; inDegree[i]=0; visit[i]=false; } } int Find(int x){ if(x!=father[x]) father[x]=Find(father[x]); return father[x]; } void Union(int x,int y){ x=Find(x); y=Find(y); if(x!=y){ if(height[x]<height[y])father[x]=y; else if(height[y]<height[x]) father[y]=x; else { father[y]=x; height[x]++; } } } bool isTree(){ bool flag=true; int component=0; int root=0; for(int i=0;i<MAXN;i++){ if(!visit[i])continue; if(father[i]==i)component++; if(inDegree[i]==0)root++; else if(inDegree[i]>1)flag=false; if(component!=1||root!=1)flag=false; if(component==0&&root==0)flag=true; } return flag; } int main(){ int x,y; int caseNum=0; init(MAXN); while(cin>>x>>y){ if(x==-1&&y==-1)break; if(x==0,y==0){ if(isTree())cout<<"Case "<<++caseNum<<" is a tree."<<endl; else cout<<"Case "<<++caseNum<<" is not a tree."<<endl; init(MAXN); }else { Union(x,y); inDegree[y]++; visit[x]=true; visit[y]=true; } } }
本题难度在如何判断是否为树,判断树的条件非常简单,就是判断入度即可,我们可以把这些节点的入度都存储一下,入度为0的情况就是根节点,且可以根据入度大于1判断为非树结构,然后解释一下为什么要用visit,因为我们要生成一个唯一的树,不能是分裂的,所以必须在假如的节点中去查询,所以这里要进行标记,然后要注意一点,定义上允许空树为树,所以要写上这一点的特殊判断。