因为题目问到了具体到哪一步排序完成了,或者出现了什么问题;所以每多增加一个字符串,就要重新进行一个拓扑排序,来判断这步操作是否可以得出答案;
#include <bits/stdc++.h>
using namespace std;
vector<int> vec[30];
int rudu[30];
queue<int> que;
queue<int> res;
int n,m;
int unsure;
int in[30];
int topsort()
{
while(!que.empty()) que.pop();
while(!res.empty()) res.pop();
for(int i=1;i<=n;i++) in[i]=rudu[i];//复制节点度数,但是本身节点度数要存下来;
for(int i=1;i<=n;i++){
if(in[i]==0){
que.push(i);
}
}
//cout<<que.size()<<" s dfsaf";
//cout<<"asdadas";
unsure=1;
while(!que.empty())
{
if(que.size()>1) unsure=-1;//不确定顺序;
int fr=que.front();
que.pop();
res.push(fr);
//printf("%c",fr+'A'-1);
for(int i=0;i<vec[fr].size();i++){
in[vec[fr][i]]--;
if(in[vec[fr][i]]==0)
//cout<<vec[fr][i]<<" ",
que.push(vec[fr][i]);
}
}
//cout<<"res="<<res.size()<<endl;
if(res.size()!=n) return 0;//形成了环
return unsure;
}
int main()
{
while(cin>>n>>m&&n&&m)
{
string tmp;
while(!res.empty()) res.pop();
while(!que.empty()) que.pop();
for(int i=1;i<=n;i++){
vec[i].clear();
}
memset(rudu,0,sizeof(rudu));
// memset(flag,0,sizeof(flag));
int sign=0;
unsure=0;
for(int i=1;i<=m;i++){
cin>>tmp;
vec[tmp[0]-'A'+1].push_back(tmp[2]-'A'+1);
rudu[tmp[2]-'A'+1]++;
if(sign) continue;
int k=topsort();
if(k==0){
sign=1;
printf("Inconsistency found after %d relations.\n",i);
}
if(k==1){
printf("Sorted sequence determined after %d relations: ",i);
while(!res.empty()){
int fr=res.front();
res.pop();
printf("%c",fr+'A'-1);
sign=1;
}
printf(".\n");
}
}
if(!sign) printf("Sorted sequence cannot be determined.\n");
}
return 0;
}