从昨天写到今天,真是弱爆了。就是用拓扑排序。但是我的存在几个问题。首先,我没有想到如果得到的关系既不能确定他们的大小关系,又有矛盾的地方就应该输出矛盾。。。所以当我一发现不能确定就return,导致我WA了。。。后来睡觉的时候想到优先级,但是又懒得起来改,于是今天晚上编完了离散的答案后,就来改,其中还有一些零碎的小细节需要注意,就不赘述了。
上代码:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int map1[27][27],n,map2[27][27],vis[27];
char ans[30];
int f(int map[27][27],int count){
int i,j,degree[27],queue[27],h=0,r=0,vist[30],flag=1;
memset(degree,0,sizeof(degree));
for(i=0;i<=n-1;i++)
vist[i]=fabs(vis[i]-1);
for(i=0;i<=n-1;i++){
for(j=0;j<=n-1;j++){
if(map[i][j]){
degree[j]++;
}
if(map[i][j] && map[j][i])
return -1;
}
}
for(i=0;i<=n-1;i++){
if(degree[i]==0 && !vist[i]){
queue[r++]=i;
vist[i]=1;
}
}
if(r>=2){
flag=0;
}
while(h!=r){
for(i=0;i<=n-1;i++){
if(map[queue[h]][i]){
degree[i]--;
}
}
for(i=0;i<=n-1;i++){
if(degree[i]==0 && !vist[i]){
queue[r++]=i;
vist[i]=1;
}
}
if(((r-h)!=2 && r!=count) || (r-h>2 && r==count))
flag=0;
h++;
}
if(r==n && flag){
for(i=0;i<=n-1;i++){
ans[i]=queue[i]+'A';
}
return 1;
}
if(r==count)
return 0;
return -1;
}
int main(){
int m,i,flag,j,count;
char s[4];
while(scanf("%d %d",&n,&m)!=-1 && (n || m)){
getchar();
count=0;flag=0;
memset(map1,0,sizeof(map1));
memset(vis,0,sizeof(vis));
for(i=0;i<=m-1;i++){
scanf("%s",s);
if(!vis[s[0]-'A']){
count++;
vis[s[0]-'A']=1;
}
if(!vis[s[2]-'A']){
count++;
vis[s[2]-'A']=1;
}
map1[s[0]-'A'][s[2]-'A']=1;
if(count==n && !flag){
if(!flag && f(map1,count)==1){
printf("Sorted sequence determined after %d relations: ",i+1);
for(j=0;j<=n-1;j++)
printf("%c",ans[j]);
printf(".\n");
flag=1;
}
if( !flag && f(map1,count)==-1 ){
printf("Inconsistency found after %d relations.\n",i+1);
flag=1;
}
}
}
if(!flag && f(map1,count)==0 ){
printf("Sorted sequence cannot be determined.\n");
flag=1;
}
if( !flag && count==n && f(map1,count)==1 ){
printf("Sorted sequence determined after %d relations: ",i);
for(i=0;i<=n-1;i++)
printf("%c",ans[i]);
printf(".\n");
flag=1;
}
if(!flag && f(map1,count)==-1 ){
printf("Inconsistency found after %d relations.\n",i);
flag=1;
}
}
return 0;
}