调了两个小时的代码...贴出来攒人品,注意判断顺序...
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
int in[30],tmp[30],sorted[30],tail;
bool relation[30][30];
int topsort(int n)
{
memcpy(tmp,in,sizeof(in));
tail=0;
bool flag=0;
int i,time=n,now,to,cnt=0;
while(time--)
{
cnt=0;
for(i=0;i<n;++i)
if(tmp[i]==0)
now=i,cnt++;
if(cnt==0)
return -1;
if(cnt>1)
flag=true;
for(i=0;i<n;++i)
if(relation[now][i])
tmp[i]--;
tmp[now]=-1;
sorted[tail++]=now;
}
if(flag==1)
return 0;
return 1;
}
int main()
{
int n,m,i,j,fm,to,flag;
bool done;
char s[5];
// ifstream fin("data.txt");
// while(fin>>n>>m)
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
memset(in,0,sizeof(in));
memset(relation,0,sizeof(relation));
done=0;
for(i=0;i<m;++i)
{
// fin>>s[0]>>s[1]>>s[2];
cin>>s[0]>>s[1]>>s[2];
fm=s[0]-'A',to=s[2]-'A';
if(!done&&!relation[fm][to])
{
relation[fm][to]=1;
in[to]++;
flag=topsort(n);
if(flag==1)
{
cout<<"Sorted sequence determined after "<<i+1<<" relations: ";
for(j=0;j<n;++j)
cout<<char('A'+sorted[j]);
cout<<"."<<endl;
done=1;
}
else if(flag==-1)
{
done=1;
cout<<"Inconsistency found after "<<i+1<<" relations."<<endl;
}
// else
// {
// memcpy(in,tmp,n);
// }
}
}
if(!done)
cout<<"Sorted sequence cannot be determined."<<endl;
}
// system("pause");
return 0;
}