#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int main()
{
int in[100],in2[50],map[50][50];
char re[50];
int n,m,i,j,k,a,b,u,temp,temp1,flag;
char str[5];
while(cin>>n>>m&&n&&m)
{
queue<int> q;
memset(in,0,sizeof(in));
memset(map,0,sizeof(map));
flag=0;
for(i=0;i<m;i++)
{
temp=1;
while(!q.empty())
q.pop();
temp1=i+1;
cin>>str;
if(flag)
continue;
a=str[0]-'A'+1;
b=str[2]-'A'+1;
if(!map[a][b])
{
in[b]++;
map[a][b]=true;
}
for(k=1;k<=n;k++)
{
if(in[k]==0)
q.push(k);
}
j=0;
for(k=1;k<=n;k++)
in2[k]=in[k];
while(!q.empty())
{
if(q.size()>1)
{
temp=2;
}
u=q.front();
q.pop();
re[j++]=u+'A'-1;
for(k=1;k<=n;k++)
{
if(map[u][k])
{
in2[k]--;
if(in2[k]==0)
q.push(k);
}
}
}
if(j==n)
{
if(temp==1)
{
cout<<"Sorted sequence determined after "<<temp1<<" relations: ";
for(k=0;k<n;k++)
cout<<re[k];
cout<<"."<<endl;
flag=1;
}
else
{
if(temp1==m)
cout<<"Sorted sequence cannot be determined."<<endl;
}
}
else
{
cout<<"Inconsistency found after "<<temp1<<" relations."<<endl;
flag=1;
}
}
}
}
被这道题坑死,各种初始化错误,最好写个子函数,还有就是当多选和矛盾同时出现时,应该写矛盾,矛盾的条件是排序后j<n;所以总的思路就是先排好序,然后看是否矛盾,如果矛盾就输出,否则看中间标记的多选,若没有多选,直接输出结果,若有多选,除非数据全部输完,否则继续输入。
还有就是当输了几个数就得到结果后,输不进去数了,这时需要另外一个变量flag,当输完结果后,继续下一次循环,只是为了输入数据而已。