zoukankan      html  css  js  c++  java
  • poj 1094 Sorting It All Out 拓扑排序

    poj 1094 Sorting It All Out 拓扑排序
    //poj 1094 Sorting It All Out  拓扑排序
    //这题要先判断是否有环的存在(可以用floyd算法看有没有能到自己的结点来判断,
    //也可以把度数为0的点一个一个排除,直到没有结点为止,若还有结点没排除,且
    //没有度数为0的点,则表示有环存在),然后判断是否有多个度数为0的结点,
    //若上述两种情况都没有,则表示找到解
    
    #include <stdio.h>
    #include <string.h>
    
    #define N 30
    
    int n, m;
    int deg[N], ans[N], tmp_d[N];
    bool map[N][N];
    
    int toposort()
    {
        for(int i = 0; i < n; ++i)
            tmp_d[i] = deg[i];
    
        int cnt = 0, flag2 = 1; //flag2初始值为1表示找到解,
                //若flag2为-1时表示有多个度数为0的结点,这时要先排除没有环存在
                //即不能仅仅找到有两个以上的结点的度数为0就返回-1,而要把这些结点
                //的度数设为-1后继续找度数为0的结点,若n个结点都遍历过一次则表示没有环
                //若还没遍历完却没有度数为0的点了的时候表示有环
                //如数据:4 4 A<B  C<B  D<B  B<A
        for(int i = 0; i < n; ++i)
        {
            int n_0deg = 0, deg0;
            for(int j = 0; j < n; ++j)
            {
                if(tmp_d[j] == 0)
                {
                    n_0deg++;   //记录有几个度数为0的结点
                    deg0 = j;   //记录度数为0的结点
                }
            }
            if(n_0deg == 0) //若没找到度数为0的结点则表示有环
                return 0;
            if(n_0deg > 1)  //找到不止一个度数为0的结点
                flag2 = -1;
            tmp_d[deg0] = -1;
            for(int j = 0; j < n; ++j)
                if(map[deg0][j] == true)
                    tmp_d[j]--;
            ans[cnt++] = deg0;
        }
        return flag2;   //n个结点都排好序
    }
    
    int main()
    {
        //freopen("in.txt", "r", stdin);
        char s[4];
        while(scanf("%d%d", &n, &m), n||m)
        {
            memset(map, false, sizeof(map));
            memset(deg, 0, sizeof(deg));
            int step = 0, flag1 = 0;  //flag1初始化为0表示还没找到解
    
            for(int i = 1; i <= m; ++i)
            {
                scanf("%s", s);
                int a = s[0] - 'A', b = s[2] - 'A';
                if(map[a][b] == false)
                {
                    map[a][b] = true;
                    deg[b]++;
                }
    
    
                int res = toposort();
    
                if(flag1 == 1)  //若flag1为1时表示已找到解
                    continue;
                if(res == 0)    //若返回0表示有环
                {
                    flag1 = 1;
                    printf("Inconsistency found after %d relations.\n", i);
                }
                if(res == 1)    //res为1表示找到解了
                {
                    step = i;   //记录第几步
                    flag1 = 1;  //找到解
                    printf("Sorted sequence determined after %d relations: ", i);
                    for(int j = 0; j < n; ++j)
                        putchar(ans[j] + 'A');
                    puts(".");
                }
            }
            if(flag1 == 0)  //若flag1为0表示找不到解
                puts("Sorted sequence cannot be determined.");
        }
        return 0;
    }
  • 相关阅读:
    php的语句
    php
    git分支
    git安装及git命令的用法
    git命令
    dos命令及github介绍
    无缝轮播的案例 及css3无缝轮播案例
    ACWING 031 表示数值的字符串
    Acwing 282. 石子合并 区间dp
    Leetcode 841. 钥匙和房间 dfs bfs
  • 原文地址:https://www.cnblogs.com/gabo/p/2579534.html
Copyright © 2011-2022 走看看