这题很基础也很经典,不过个人认为有一个非常容易出错的地方,就是矛盾Inconsistency的优先级比不确定的优先级高,因为当前有矛盾就立即跳出,而当前有多个点入度为0就不能立即输出,有可能后来加入的线段可以确定唯一答案,就像下图一样。。。很阴险!wa了几次才得以ac。原本想用队列,但是不好搞
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
using namespace std;
int lowbit(int t){return t&(-t);}
int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
#define LL long long
#define PI acos(-1.0)
#define N 1000010
#define MAX INT_MAX
#define MIN INT_MIN
#define eps 1e-8
#define FRE freopen("a.txt","r",stdin)
int g[30][30];
string order;
int n,m;
int ans;
int in[30];
int vis[30];
queue<int> q;
int cnt[30];
int topsort(){
int i,j,k;
order.clear();
memcpy(cnt,in,sizeof(cnt));
int flag=0;
for(i=1;i<=n;i++){
int num=0,pos;
for(j=1;j<=n;j++)
if(cnt[j]==0)
{pos=j;num++;}
if(!num) return 0;
if(num>1) flag=1; //这里!!!不能立即跳出,因为后面接下来有可能矛盾
cnt[pos]=-1;
order+=pos-1+'A';
for(j=1;j<=n;j++)
if(g[pos][j])
cnt[j]--;
}
if(flag)return 2;
return 1;
}
/*
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(g[i][j]){
in[j]++;
vis[i]=1;
vis[j]=1;
}
for(i=1;i<=n;i++)
if(in[i]==0 && vis[i])
q.push(i);
if(q.size()==0) {return 0;}
if(q.size()>1) {return 2;}
while(!q.empty()){
int x=q.front();
q.pop();
order+=(x+'A'-1);
for(i=1;i<=n;i++){
if(g[x][i])
{
in[i]--;
if(in[i]==0)
q.push(i);
}
}
if(q.size()>1)return 2;
}
if(order.size()==n) return 1;
return 2;*/
int main(){
while(scanf("%d%d",&n,&m) && (n+m)){
int i,j,k;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
{g[i][j]=g[j][i]=0;in[i]=0;}
int tag=0;
char str[4];
for(i=1;i<=m;i++){
scanf("%s",str);
if(tag)continue;
int a=str[0]-'A'+1,b=str[2]-'A'+1;
g[a][b]=1;
in[b]++;
ans=topsort();
if(ans==0){
printf("Inconsistency found after %d relations.\n",i);
tag=1;
}
if(ans==1){
printf("Sorted sequence determined after %d relations: ",i);
cout<<order<<".\n";
tag=1;
}
}
if(!tag)
puts("Sorted sequence cannot be determined.");
}
return 0;
}