二维数组判环在先,判不确定在其次(如果有某个点导致同时两个点入度为0则cannot be determined),此时拓扑排序如果能排到n个点,直接输出顺序即可...
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int maxn=27;
vector<int>v[maxn],id[maxn];
int n,m;
bool conn[maxn][maxn];
int mark;
int in[maxn];
int ans[maxn];
int anscnt=0;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
in[i]=0;
}
bool vis=0;
int mark;
for(int i=1;i<=m;i++){
string str;
cin>>str;
if(vis==1) continue;
int now1=str[0]-'A'+1,now2=str[2]+1-'A';
if(conn[now1][now2]==1) continue;
if(conn[now2][now1]==1){
vis=1;
mark=i;
}
conn[now1][now2]=1;
v[now1].push_back(now2);
id[now1].push_back(i);
in[now2]++;
for(int j=1;j<=n;j++){
if(conn[j][now1]==1){
conn[j][now2]=1;
}
if(conn[now2][j]==1){
conn[now1][j]=1;
}
}
}
if(vis==1){
cout<<"Inconsistency found after "<<mark<<" relations."<<endl;
return 0;
}
queue<int>q;
int cnt=0;
for(int i=1;i<=n;i++){
if(in[i]==0){
cnt++;
q.push(i);
ans[++anscnt]=i;
if(cnt==2){
cout<<"Sorted sequence cannot be determined."<<endl;
return 0;
}
}
}
int maxrec=0;
while(!q.empty()){
cnt=0;
int now=q.front();
q.pop();
for(int i=0;i<v[now].size();i++){
maxrec=max(maxrec,id[now][i]);
int newn=v[now][i];
in[newn]--;
if(in[newn]==0){
ans[++anscnt]=newn;
cnt++;
if(cnt==2){
cout<<"Sorted sequence cannot be determined."<<endl;
return 0;
}
if(anscnt==n){
cout<<"Sorted sequence determined after "<<maxrec<<" relations: ";
for(int i=1;i<=n;i++){
char k=ans[i]+'A'-1;
cout<<k;
}
cout<<"."<<endl;
return 0;
}
q.push(newn);
}
}
}
cout<<"Sorted sequence cannot be determined."<<endl;
return 0;
}