POJ 1094 Sorting It All Out【拓扑排序】
题意: 给出一定的大写字母,并依次给出 m 个两两关系,如果在输入关系的过程中发现有环,或已经能确定所有序列的关系,则输出相应的结果,并且以后输入的关系
不会对当前结果产生影响。
分析: 如果在输入过程每输入一个进行依次拓扑排序,如果排序中出现没有 0 入度的点则说明有环,如果每次找到的 入度为 0 的点均为一个,并且找到n 个,则顺序
可以被确定。
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) int g[30][30]; int d[30]; int res[30]; int n; int topo() { int i,j,t2=1,tot=0,tmp,top=0; int t[30]; for(i=0;i<n;i++) t[i]=d[i]; for(i=0;i<n;i++) { tot=0; for(j=0;j<n;j++) if(t[j]==0) { tot++; tmp=j; } if(tot==0) return 0; if(tot>1) t2=-1; t[tmp]=-1; res[top++]=tmp; for(j=0;j<n;j++) if(g[tmp][j]) t[j]--; } return t2; } int main() { int m,f1,f2,i,j; char s[5]; while(scanf("%d%d",&n,&m),n||m) { f1=0; clr(g); clr(d); for(i=1;i<=m;i++) { scanf("%s",s); g[s[0]-'A'][s[2]-'A']=1; d[s[2]-'A']++; if(f1==0) f2=topo(); if(f2==1&&f1==0) { printf("Sorted sequence determined after %d relations: ",i); for(j=0;j<n;j++) printf("%c",res[j]+'A'); printf(".\n"); f1=1; } if(f2==0&&f1==0) { printf("Inconsistency found after %d relations.\n",i); f1=1; } } if(f1==0) printf("Sorted sequence cannot be determined.\n"); } return 0; }