题目链接:http://poj.org/problem?id=1094
题意:给出多组关系,判断能否组成唯一的拓扑排序。
思路:
判断三种情况:
①是否有环
②是否有序(唯一性)
③能否组成拓扑排序
这题还是比较纠结的,应该先考虑是否唯一,然后判断能否形成拓扑排序,在考虑是否有序。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=105;
int T,n,m;
int map[maxn][maxn];
int degree[maxn];
char p[maxn];
char str[10];
int topo_Sort(int n){
int k=0,flag=1;
int tmp[maxn];
for(int i=0;i<n;i++)
tmp[i]=degree[i];
while(k<n){
int m=0,index;
for(int i=0;i<n;i++){
if(!tmp[i]){
m++;
index=i;
}
}
if(!m) return 0;//有环
if(m>1) flag=-1;//无序
tmp[index]--;
p[k++]=index+'A';
for(int j=0;j<n;j++){
if(map[index][j]){
tmp[j]--;
}
}
}
return flag;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
#endif
while(~scanf("%d%d",&n,&m)){
if(!n&&!m) break;
memset(map,0,sizeof(map));
memset(degree,0,sizeof(degree));
int flag=0;
for(int i=0;i<m;i++){
scanf("%s",str);
if(flag) continue;
int a=str[0]-'A';
int b=str[2]-'A';
map[a][b]=1;
degree[b]++;
int sign=topo_Sort(n);
if(sign==0){
printf("Inconsistency found after %d relations.\n",i+1);
flag=1;
}
if(sign==1){
printf("Sorted sequence determined after %d relations: ",i+1);
for(int i=0;i<n;i++){
printf("%c",p[i]);
}
puts(".");
flag=1;
}
}
if(!flag){
printf("Sorted sequence cannot be determined.\n");
}
}
return 0;
}