poj 1094 Sorting It All Out(拓扑排序)
题目:http://poj.org/problem?id=1094
题意:给定一个关系,判断三种情况
1、到第几组的时候就可以判断出 什么关系了
2、到第几组的时候可以判断矛盾
3、判断不出来
每次输入,都要 拓扑 判断
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<stack> 6 #include<queue> 7 #include<cmath> 8 #include<algorithm> 9 using namespace std; 10 11 int flag,dis[30],cnt; 12 int n,G[100][100],r[30]; 13 char f[300]; 14 void find() 15 { 16 int i,j,k,count,x; 17 flag=1; //一直为1 的话说明 判断出关系了 18 cnt=0; 21 memcpy(dis,r,n*sizeof(int)); 22 for(i=0; i<n; i++) 23 { 24 count=0; 25 for(j=0; j<n; j++) 26 { 27 if(dis[j]==0) 28 { 29 x=j; 30 count++; 31 } 32 } 33 if(count==0) // 入度都为0,说明有回环 34 { 35 flag = 0; 36 return; 37 } 38 if(count>1) //说明现在还没判断出关系来 39 flag = -1; 40 dis[x] = -1; 41 f[cnt++]=x+65; 42 for(j=0; j<n; j++) 43 { 44 if(G[x][j]) 45 dis[j]--; 46 } 47 } 48 } 49 int main() 50 { 51 int m,i,j,k; 52 int x; 53 char a,b,c; 54 while(cin>>n>>m&&(m!=0||n!=0)) 55 { 56 getchar(); 57 flag = 0; cnt=0; 58 memset(r,0,sizeof(r)); 59 memset(G,0,sizeof(G)); 60 for(k=1; k<=m; k++) 61 { 62 x=0; 63 scanf("%c%c%c",&a,&b,&c); 64 getchar(); 65 if(flag) 66 continue; 67 if(G[a-65][c-65]==0) 68 { 69 G[a-65][c-65]=1; 70 r[c-65]++; 71 } 72 find(); 73 switch(flag) 74 { 75 case -1:flag=0; break; 76 case 0: flag=1; printf("Inconsistency found after %d relations.\n",k); break; 77 case 1: f[cnt]='\0'; printf("Sorted sequence determined after %d relations: %s.\n",k,f); break; 78 } 79 } 80 if(!flag) 81 printf("Sorted sequence cannot be determined.\n"); 82 } 83 return 0; 84 }