不知道为什么不能AC,这道题有2个地方特别要注意,一个是注意空树的情况存在,另外一个是在分配链表的时候别忘记了释放内存空间,不然会导致错误。 #include<iostream> #include<vector> #include<cmath> #include<string> #include<fstream> #include<stack> using namespace std; const int MAX_NODE=5120; struct Edge //有向边的结构类型 { int f,t; //有向边的起点和终点索引 Edge *next; //指向下一条有向边的指针 }; Edge* edgeList=NULL;//指向边集的头指针 int node[MAX_NODE];// i为结点node[i]的索引 int nodeNum=0; //结点个数 int vst[MAX_NODE]; //v[i] 为从根节点遍历时,索引为i的节点被访问的次数 int GenNodeIndex(int nd);//生成结点的索引并返回,并且更新结点的个数 int EdgeNumNode(int nodeIndex);//求出指向nodeIndex的边条数 void VisitNode(int nodeIndex); //从索引为nodeIndex的结点开始遍历其余结点 bool IsATree(); //判断是否是一棵树 int main() { ifstream cin("d://1.txt"); int f,t ; //有向边的起点和终点 int T=0; //测试数据初始化为0 Edge*p; while(cin>>f>>t&&!(f==-1&&t==-1)) { T++; nodeNum=0; while(!(f==0&&t==0)) { p=new Edge(); p->f=GenNodeIndex(f); p->t=GenNodeIndex(t); p->next=edgeList; edgeList=p; cin>>f>>t; } if(IsATree()) cout<<"Case "<<T<<" is a Tree."<<endl; else cout<<"Case "<<T<<" is not a Tree."<<endl; //释放内存 while(edgeList!=NULL) { p=edgeList; edgeList=edgeList->next; delete p; } } system("pause"); return 0; } int GenNodeIndex(int nd) { int i=0; //若nd已存在node中则返回其索引 for(i=0;i<nodeNum;i++) { if(node[i]==nd) return i; } //将nd插入node尾部并且返回其索引 node[nodeNum]=nd; nodeNum++; return nodeNum-1; } int EdgeNumNode(int nodeIndex) { Edge* p=edgeList; int edgeNum=0; while(p!=NULL) { if(p->t==nodeIndex) edgeNum++; p=p->next; } return edgeNum; } void VisitNode(int nodeIndex) { Edge*p=edgeList; vst[nodeIndex]++; //结点nodeIndex访问次数加一 while(p!=NULL) { if(p->f==nodeIndex) VisitNode(p->t); p=p->next; } } bool IsATree() { if(nodeNum==0) return true ; //空树 int rootIndex=-1; //设置根结点索引为-1; for(int i=0;i<nodeNum;i++) { int edgeNum=EdgeNumNode(i); if(edgeNum==0) //树根 { if(rootIndex==-1) rootIndex=i; else return false; //树根多于一个 } else if(edgeNum>1) return false; //非树根且多余1条有向边指向它 } if(rootIndex==-1) return false; //没有树根 for(int i=0;i<nodeNum;i++) vst[i]=0; VisitNode(rootIndex); for(int i=0;i<nodeNum;i++) { if(vst[i]!=1) // 索引为i的结点被访问的次数大于1或未被访问 return false; } return true; }