题意:就是判断他给你的逻辑关系中有没有矛盾,或关系不能确定,还是能确定。。。拓扑排序。。。不过是要加入一个关系判断一次,首先会发现不能确定的关系只能最后判断,而矛盾和关系确定就要一边加,一边判断。。。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
bool gp[30][30];
char vd[30];
int into[30],flag;
int find_huan(int n)
{
int i,j,k=-1;
for(i=0;i<n;i++)
{
if(!into[i])
{
if(k==-1)
{
k=i;
}
else
flag=1;
}
}
return k;
}
int topsort(int n)
{
int i,j,k;flag=0;
memset(vd,'/0',sizeof(vd));
memset(into,0,sizeof(into));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(gp[i][j])
into[j]++;
}
/*for(i=0;i<n;i++)
cout<<into[i]<<' ';
cout<<'/n';*/
for(i=0;i<n;i++)
{
k=find_huan(n);
if(k==-1)
return 0;
into[k]=-1;
vd[i]=k+'A';
for(j=0;j<n;j++)
{
if(gp[k][j])
into[j]--;
}
}
if(!flag)
return 2;
else
return 1;
}
int main()
{
int i,j,k,n,m,x,y,lg;
char s[5];
while(1)
{
cin>>n>>m;
lg=0;
if(!n&&!m)
return 0;
memset(gp,0,sizeof(gp));
for(i=0;i<m;i++)
{
scanf("%s",s);
if(lg)
continue;
getchar();
x=s[0]-'A';
y=s[2]-'A';
gp[x][y]=1;
k=topsort(n);
if(k==0)
{
printf("Inconsistency found after %d relations./n",i+1);
lg=1;
}
else
if(k==2)
{
printf("Sorted sequence determined after %d relations: %s./n",i+1,vd);
lg=1;
}
}
if(lg==0)
{
printf("Sorted sequence cannot be determined./n");
}
}
return 0;
}