http://poj.org/problem?id=1094
注意:1、判断是否有冲突(成环);
2、判断是否形成确定关系(一旦形成序列,就忽略后面的关系);
3、如果全部关系都判断完了,还未形成序列,才是序列关系不明确。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=505;
char str[1000][5];
int a[NM][NM],indu[NM],save[NM],n;
int Tuopu(){
int i,j,k,ling,flag=1;
memset(indu,0,sizeof(indu));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
if(a[i][j]) indu[j]++;
}
for(i=1;i<=n;i++){
k=1;ling=0;
for(j=1;j<=n;j++){
if(indu[j]==0) ling++,k=j;
}
if(ling==0) return 2; //冲突
else if(ling>1) flag=-1; //序列关系不明确
save[i]=k;
indu[k]--;
for(j=1;j<=n;j++){
if(a[k][j]) indu[j]--;
}
}
return flag;
}
int main()
{
int i,j,m,x,y,t;
while(scanf("%d%d",&n,&m) && (n||m)){
memset(a,0,sizeof(a));
for(i=0;i<m;i++) scanf("%s",str[i]);
for(i=0;i<m;i++){
x=str[i][0]-'A'+1;y=str[i][2]-'A'+1;
a[x][y]=1;
t=Tuopu();
if(t==1 || t==2) break;
}
if(t==1){
printf("Sorted sequence determined after %d relations: ",i+1);
for(j=1;j<=n;j++) printf("%c",'A'+save[j]-1);
printf(".\n");
}
else if(t==2){
printf("Inconsistency found after %d relations.\n",i+1);
}
else printf("Sorted sequence cannot be determined.\n");
}
return 0;
}