poj1094Sorting It All Out(拓扑排序)

http://poj.org/problem?id=1094

1A 这题下午想了好久 一直没调出来 由于是边输入边拓扑排序 入度改变之后下次再排会出错 晚上回来想到这一点 每次全复制一遍 只对入度进行操作 不进行改变

这个题要 判断三种情况

一种是有环 在给出几种关系时出现矛盾

二是在给出几种关系时 n个数已经排好了序

三是 输完还是无法排出一种序 这是属于拓扑排序不唯一的情况 也就是同时有多个结点出现的入度为0

View Code
  1 #include<stdio.h>

  2 #include<string.h>

  3 int f[100],g[50][50],kk[30],q[50];

  4 int topo(int n,int m)

  5 {

  6     int i,j,f2 = 0,f1=0,x,dd[50],d,y = 0;

  7     for(i = 1; i <= n ; i++)

  8         dd[q[i]] = f[q[i]];

  9     for(i = 1; i <= n ; i++)

 10     {

 11         f1 = 0;

 12         for(j = 1; j <= n ; j++)

 13         {            

 14             if(dd[q[j]]== 0)

 15             {

 16                 f1 ++;

 17                 d = q[j];

 18             }                                

 19         }

 20         if(f1)

 21         {

 22             f2++;

 23             if(f1>1)

 24             y = 1;

 25             dd[d] = -1;

 26             kk[f2] = d;

 27             for(x = 1; x <= n ; x++)

 28                 if(g[d][q[x]])

 29                     dd[q[x]]--;

 30         }

 31         else

 32             break;

 33     }

 34     if(f2<n)

 35     return 0;

 36     else

 37     if(f2==m&&!y)

 38     return 1;

 39     else

 40     return 2;

 41 }

 42 int main()

 43 {

 44     int i,j,k,n,m,w[28],x;

 45     char c1,c2;

 46     while(scanf("%d%d", &n,&m)&&n&&m)

 47     {

 48         int h1=0,h2 =0;

 49         int d = 0;

 50         memset(w,0,sizeof(w));

 51         memset(f,0,sizeof(f));

 52         memset(g,0,sizeof(g));

 53         for(i = 1; i <= m ; i++)

 54         {

 55             scanf("%*c%c%*c%c",&c1,&c2);

 56             if(!w[c1-'A'])

 57             {

 58                 d++;

 59                 q[d] = c1-'A';

 60                 w[c1-'A'] = 1;

 61             }

 62             if(!w[c2-'A'])

 63             {

 64                 d++;

 65                 q[d] = c2-'A';

 66                 w[c2-'A'] = 1;

 67             }

 68             if(!g[c1-'A'][c2-'A'])

 69             {

 70                 g[c1-'A'][c2-'A']= 1;

 71                 f[c2-'A']++;

 72             }

 73             if(!h1&&!h2)

 74             {

 75                 int mm = topo(d,n);

 76                 if(mm==1)

 77                 {

 78                     x  = i;

 79                     h1 = 1;

 80                 }

 81                 if(!mm)

 82                 {

 83                     x = i;

 84                     h2 = 1;

 85                 }

 86             }

 87         }

 88         if(h1)

 89         {

 90             printf("Sorted sequence determined after %d relations: ",x);

 91             for(i = 1; i <= n ; i++)

 92                 printf("%c",kk[i]+'A');

 93             printf(".\n");

 94         }

 95         if(h2)

 96         {

 97             printf("Inconsistency found after %d relations.\n",x);

 98         }

 99         if(!h1&&!h2)

100             printf("Sorted sequence cannot be determined.\n");

101     }

102     return 0;

103 }

 

你可能感兴趣的:(sort)