POJ 1094 Sorting It All Out(拓扑排序)

题目链接

其实我不懂拓扑排序啊。。。看了DISCUSS,需要判断是不是有环,我傻呼呼的写了个DFS。。。拓扑排序没学好啊。。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <algorithm>
  6 using namespace std;
  7 char str[10001][4],ch[31];
  8 int in[50],out[50],o[301],in2[50],out2[50],z[27];
  9 int p[51][51],n,p2[51][51],flag;
 10 int judge()
 11 {
 12     int i,j,num,t,t2;
 13     for(i = 1; i <= n; i ++)
 14     {
 15         in2[i] = in[i];
 16         out2[i] = out[i];
 17     }
 18     for(i = 1; i <= n; i ++)
 19     {
 20         for(j = 1; j <= n; j ++)
 21             p2[i][j] = p[i][j];
 22     }
 23     flag = 0;
 24     for(i = 1; i <= n; i ++)
 25     {
 26         num = 0;
 27         for(j = 1; j <= n; j ++)
 28         {
 29             if(in2[j] == 0)
 30             {
 31                 num ++;
 32                 t = j;
 33             }
 34             else if(in2[j])
 35             {
 36                 t2 = j;
 37             }
 38         }
 39         if(num > 1)
 40             flag = 1;
 41         if(num == 0)
 42             return 0;
 43         for(j = 65; j <= 90; j ++)
 44         {
 45             if(o[j] == t)
 46             {
 47                 ch[i-1] = j;
 48                 break;
 49             }
 50         }
 51         in2[t] = -1;
 52         for(j = 1; j <= 26; j ++)
 53         {
 54             if(p2[t][j])
 55             {
 56                 in2[j] --;
 57                 p2[t][j] = 0;
 58             }
 59         }
 60     }
 61     if(flag) return 2;
 62     ch[n] = '\0';
 63     return 1;
 64 }
 65 int main()
 66 {
 67     int m,i,t1,t2,num;
 68     while(scanf("%d%d",&n,&m)!=EOF)
 69     {
 70         if(!n&&!m) break;
 71         memset(in,0,sizeof(in));
 72         memset(out,0,sizeof(out));
 73         memset(p,0,sizeof(p));
 74         memset(o,0,sizeof(o));
 75         for(i = 1; i <= m; i ++)
 76             scanf("%s",str[i]);
 77         num = 1;
 78         for(i = 1; i <= m; i ++)
 79         {
 80             t1 = str[i][0];
 81             t2 = str[i][2];
 82             if(!o[t1])
 83             {
 84                 o[t1] = num ++;
 85             }
 86             if(!o[t2])
 87             {
 88                 o[t2] = num ++;
 89             }
 90         }
 91         for(i = 1; i <= m; i ++)
 92         {
 93             t1 = str[i][0];
 94             t2 = str[i][2];
 95             p[o[t1]][o[t2]] = 1;
 96             out[o[t1]] ++;
 97             in[o[t2]] ++;
 98             if(judge() == 1)
 99             {
100                 printf("Sorted sequence determined after %d relations: %s.\n",i,ch);
101                 break;
102             }
103             else if(judge() == 0)
104             {
105                 printf("Inconsistency found after %d relations.\n",i);
106                 break;
107             }
108         }
109         if(i == m+1)
110             printf("Sorted sequence cannot be determined.\n");
111     }
112     return 0;
113 }

 

posted @ 2012-12-06 09:29  Naix_x  阅读(150)  评论(0编辑  收藏  举报