• Sorting It All Out(拓扑排序)


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

    1.判断所给关系是否为合法的拓扑序列,若存在环,输出

    "Inconsistency found after %d relations."但仍继续输入。

    2.判断是否可以确定序列,若不可以确定,继续输入,若可以确定输出

    "Sorted sequence determined after %d relations: %s."后,继续输入数据。

    3.若输入完数据仍不可以确定序列,输出"Sorted sequence cannot be determined.".

     1 #include<stdio.h>
     2 #include<string.h>
     3 const int N=102;
     4 int map[N][N],in[N],vis[N];
     5 int n,m,flag,top;
     6 char s[N];
     7 void topo()
     8 {
     9     int cnt,i,j,pos;
    10     top = 0;
    11     int d[N];//存每个点的度数
    12     flag = 1;
    13     memset(vis,0,sizeof(vis));
    14     memcpy(d,in,n*sizeof(int));
    15     for (i = 0; i < n; i ++)
    16     {
    17         cnt = 0;
    18         for (j = 0; j < n; j ++)
    19         {
    20             if (d[j]==0)
    21             {
    22                 cnt++;
    23                 pos = j;
    24             }
    25         }
    26         if (cnt==0)//存在环
    27         {
    28             flag = 0;
    29             return ;
    30         }
    31         if (cnt > 1)//不确定序列
    32         {
    33             flag = 2;
    34         }
    35         --d[pos];
    36         s[top++] = pos+'A';
    37         for (int k =  0; k < n; k ++)
    38         {
    39             if(map[pos][k]==1)
    40                 --d[k];//更新度数
    41         }
    42     }
    43     s[top++] = '';
    44 
    45 }
    46 int main()
    47 {
    48     while(~scanf("%d%d%*c",&n,&m))
    49     {
    50         if (n==0 && m==0)
    51             break;
    52         flag = 0;
    53         memset(in,0,sizeof(in));
    54         memset(map,0,sizeof(map));
    55         char a,b,c;
    56         int i;
    57         for (i = 1; i <= m; i ++)
    58         {
    59             scanf("%c%c%c%*c",&a,&b,&c);
    60             if (flag)//控制输入
    61                 continue;
    62             if (!map[a-'A'][c-'A'])
    63             {
    64                 map[a-'A'][c-'A'] = 1;
    65                 in[c-'A']++;
    66             }
    67             topo();
    68             if (flag==0)
    69             {
    70                 flag = 1;//以便能继续输入下面的点
    71                 printf("Inconsistency found after %d relations.
    ",i);
    72             }
    73             else if (flag==1)
    74             {
    75                 printf("Sorted sequence determined after %d relations: %s.
    ",i,s);
    76             }
    77             else if (flag==2)//无法确定序列,继续输入
    78             {
    79                 flag = 0;//继续拓扑
    80             }
    81         }
    82         if (flag==0)//输入完也无法确定序列
    83             printf("Sorted sequence cannot be determined.
    ");
    84     }
    85     return 0;
    86 }
    View Code
  • 相关阅读:
    常用 Git 命令清单
    radhat 6.4/centos 6.4 下编译安装 最新ruby 2.1.5
    centos 6.4/redhat 6.4 安装gitlab
    微信小程序——navigator无法跳转
    微信小程序——修改data里面数组某一个值
    微信小程序——template的循环嵌套
    微信小程序——template的使用方法
    node学习笔记8——发布npm包
    淘宝镜像使用方法
    node学习笔记7——npm安装包
  • 原文地址:https://www.cnblogs.com/lahblogs/p/3260911.html
Copyright © 2020-2023  润新知