囧,卡了好久好久好久好久呀! 这个题就是判断是不是树,先判断基本情况:只有一个根节点;不能出现入度大于1的点;顶点数等于边数加上1;都满足的话再利用BFS判断树的连通性,排除环的情况。 #include<iostream> #include<cstring> #include<queue> #include<set> using namespace std; const int nax=1000; int mmax=-1; int a[nax],b[nax],c[nax]; bool matrix[nax/10][nax/10]; int sum;//点的个数 void bfs(int a) { queue<int>q; int tmp,i; q.push(a); while(!q.empty()) { tmp=q.front(); q.pop(); for(i=1;i<=sum;++i) { if(matrix[tmp][i]) { matrix[tmp][i]=false; q.push(i); } } } } int main() { int edge; set<int>pzj; int m,n; bool is,ak; int root;//记录根节点 int k=0,i,j; while(true) { sum=0; memset(matrix,false,sizeof(matrix)); ak=true; pzj.clear(); edge=0; is=true; i=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); scanf("%d%d",&m,&n); if(m==-1 && n==-1) break; if((m+n)==0) { printf("Case %d is a tree./n",++k); continue; } if(mmax<m) mmax=m; if(mmax<n) mmax=n; matrix[m][n]=true; edge++; pzj.insert(m); pzj.insert(n); c[m]++; b[n]++; if(c[m]==1) a[i++]=m; while(scanf("%d%d",&m,&n) && (m+n)) { if(mmax<m) mmax=m; if(mmax<n) mmax=n; matrix[m][n]=true; edge++; pzj.insert(m); pzj.insert(n); c[m]++; if(c[m]==1) a[i++]=m;//保存父节点并防止重复保存,即重复出现的就不用保存了 b[n]++; if(b[n]>1)//出现入度大于1 is=false; } if(!is) { printf("Case %d is not a tree./n",++k); continue; }//满足没有节点入度大于1 int cou=0; if(pzj.size()-1!=edge) { printf("Case %d is not a tree./n",++k); continue; } else//满足点边关系 { for(j=0;j<i;j++) if(b[a[j]]==0)//没有在儿子节点出现过 { cou++; root=a[j];//记录根节点 } } if(cou==1)//满足只有一个根的条件 { sum=mmax;//点的个数 bfs(root);//判断有无环的情况 for(i=1;i<=sum;++i) for(j=1;j<=sum;++j) if(matrix[i][j]) goto hoho; printf("Case %d is a tree./n",++k); } else hoho: printf("Case %d is not a tree./n",++k); } return 0; } 附送经典测试数据: 0 0//树 1 1 0 0 1 2 1 2 0 0 1 2 2 3 4 5 0 0 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 0 0 1 2 2 1 0 0 1 2 2 3 3 1 5 6 0 0 1 2 1 3 1 4 1 5 0 0//树,其余均不是 -1 -1