来源:点击打开链接
不知道怎么回事,wa了整整一天。。在绝望的时候AC了。
重点是分步处理和三种情况的判断。
1、判断是否成环,成环了直接输出错误信息。
2、然后一条边一条边的加入,进行拓扑排序,如果出度为0的点多于两个,继续判断之,如果到所有点都加入了但仍然没有判断出来,输出第三种情况。
3、以上两种情况都不存在,输出拓扑排序的路径信息。
#include <iostream> #include <cstring> #include <string> using namespace std; int mat[105][105]; int ans[105]; int indegree[105]; int length,rela,tflag,loopflag; int TopoLogic() { int loopcount=0;//0入度数统计 int entrypoint=0;//第几个检测到0入度,加入队列 int t=0; int flag=1; memset(indegree,0,sizeof(indegree)); for (int a=0;a<length;a++) //求目前图的入度 { for (int b=0;b<length;b++) { if (mat[a][b]) indegree[b]++; } } for (int i=0;i<length;i++) { loopcount=0; for (int j=0;j<length;j++) { if (indegree[j]==0) { loopcount++; entrypoint=j; } } if (loopcount>1) flag=-1; //出现多种情况,不好说 if (loopcount==0 && loopcount!=length)//第二个条件很容易忘 return 0; ans[t++]=entrypoint; indegree[entrypoint]=-1;//去点 for (int p=0;p<length;p++) { if (mat[entrypoint][p]==1) indegree[p]--; } } return flag; } int main() { while (cin>>length>>rela) { if (length==0 && rela==0) break; memset(mat,0,sizeof(mat)); memset(indegree,0,sizeof(indegree)); tflag=0;//队列标志 string tar; for (int t=1;t<=rela;t++) { int resulter; cin>>tar; mat[tar[0]-'A'][tar[2]-'A']=1; memset(ans,0,sizeof(ans)); if (tflag==0) { resulter=TopoLogic(); //cout<<resulter<<endl; } if (resulter==1 && tflag==0) { cout<<"Sorted sequence determined after "<<t<<" relations: "; for (int a=0;a<length;a++) cout<<(char)(ans[a]+'A'); cout<<"."<<endl; tflag=1; } if(resulter==0 && tflag==0) { cout<<"Inconsistency found after "<<t<<" relations."<<endl; tflag=1; } } if(tflag==0) cout<<"Sorted sequence cannot be determined."<<endl; //全部判断完再输出矛盾!! } return 0; }