• Algernon's Noxious Emissions POJ1121 zoj1052


    One of the greatest alchemists of the lower Middle Renaissance, Algernon da Vinci (one of Leonardo's lesserknown cousins), had the foresight to construct his chemical works directly over a fast-running stream. Through a series of clever pipes and sluices, he routed portions of the stream past each of the tables where his alchemists prepared their secret brews, allowing them to dispose of their chemical byproducts into the waters flowing by the table.

    As Algernon's business grew, he even added additional floors to his factory, with water lifted to the higher floors by treadmill-powered pumps (much to the dismay of the apprentices who found themselves assigned to pump duty). The pipework for the entire disposal system became quite complex. It was even rumored by some that the pipes actually circled back in some places, so that a particularly odorous compound flushed away from one table might return to that very same spot a few minutes later.

    All was not well, however. Algernon's factory suffered from a series of mishaps, minor explosions, gas clouds, etc. It became obvious that chemicals dumped at one table might react violently with other chemicals dumped from another table downstream. Algernon realized that he needed to trace the possible chemical flows through his factory.

    Write a program to aid Algernon in this task. To preserve the secrecy of the chemical processes that are Algernon's stock in trade, all chemicals will be identified by a single upper-case letter. All tables are identified by positive numbers in the range 1��N, where N is the number of tables.

    Input Format:

    Line 1:
    # of work tables, integer (henceforth referred to as N). N < 50

    Lines 2��N+1
    For each table:

    • a list of chemicals dumped into the stream at that table, followed by
    • a list of chemicals that, if they appeared at that table, would be harmlessly neutralized by the reactions at that table, allowing no further trace of that chemical to flow downstream (we will assume that the rate of work at each table can be adjusted as necessary to guarantee total neutralization of whatever amount of these chemicals arrive from upstream).


    Each of these lists is given as a series of upper-case alphabetic characters. The only exception is that a special list, consisting of a single '.' character, will be used to denote an empty list. The two lists are separated from one other by one or more blanks. The same chemical will never appear in both lists.

    Lines N+2��?
    These lines provide a description of the pipeworks. Each line contains a pair of integers in the range 1��N, separated by one or more blanks:
    I J
    meaning that the table number I is upstream of table number J - anything dumped into the stream at table I or that arrives in the stream at table I and is not neutralized can then be counted on to arrive at table J.

    No (I,J) pair will be listed more than once, but the pairs may occur in any order. I and J will never be the same number.

    The end of input is signaled by a pair of zeros:
    0 0

    Note that if a table only receives water directly from the stream entering the building, that table will never occur in the second position of a pair. Similarly, any table that discharges only into the stream leaving the building will never occur in the first position of a pair.


    Output Format:

    There will be N lines of output, one for each table, in the same order as they appeared in the program input. Each line will contain the list of chemicals that can be expected at that table's output. This list will be printed as a (possibly empty) list of upper-case alphabetic characters between two colons (:). No empty spaces should be printed on the line. The characters in the list should be sorted in alphabetic order.


    This problem contains multiple test cases!

    The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.

    The output format consists of N output blocks. There is a blank line between output blocks.

     

    Sample Input:

    For the figure at the right, an input would be:
    1

    4
    AB C
    C BDA
    BCD .
    . A
    1 2
    2 4
    3 1
    1 3
    3 4
    0 0


    Sample Output:

    :ABD:
    :C:
    :ABCD:
    :BCD: 

    POJ是一个测试案例,只需注释Line  和ICase这几行就行。

    #include <stdio.h>
    #include <memory.h>
    
    const int MAXN = 51;
    
    int main()
    {
        int i, j;
        int mask[32];
        for (i = 0; i < 32; i++) 
            mask[i] = 1<<i;
        int iCase;
        scanf("%d", &iCase);
        int line = 0;
        while (iCase--)
        {    
            if (line) printf("
    ");
            line = 1;
            int output[MAXN];
            int dump[MAXN];
            int neutra[MAXN];
            char c;
            int n;
            scanf("%d
    ", &n);
            for (i = 1; i <= n; i++)
            {    
                int temp = 0;
                do    {    
                    c = getc(stdin);
                    if (c >= 'A') temp |= mask[c-'A'];
                } while (c != ' ');
                dump[i] =  output[i] = temp;
                temp = 0;
                while((c = getc(stdin)) != '
    ')
                    if (c >= 'A') temp |= mask[c-'A'];
                neutra[i] = temp; 
                dump[i] &= ~temp; 
                output[i] &= ~temp;
            }
            bool graph[MAXN][MAXN];
            bool table[MAXN];
            memset(graph, 0, sizeof(graph));
            for (i = 1; i <= n; i++)
                table[i] = true;
            int a, b;
            while(scanf("%d %d", &a, &b) && (a || b)) 
                graph[a][b] = true;
            bool flag;
            do  {
                flag = false;
                for (i = 1; i <= n; i++)
                    if (table[i])
                    {    
                        table[i] = false;
                        int temp = output[i];
                        for (j = 1; j <= n; j++)
                            if (graph[i][j])
                            {    
                                int newOut = (output[j] | temp) & (~neutra[j]);
                                if (output[j] != newOut)
                                {    
                                    output[j] = newOut; 
                                    table[j] = true;
                                }
                            }
                        flag = true;
                        break;
                    }
            } while (flag);
            for (i = 1; i <= n; i++)
            {    
                printf(":");
                for (j = 0; j <= 25; j++)
                    if ((output[i] & mask[j]) != 0) 
                        printf("%c", char(j+'A'));
                printf(":
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    基于Spring+SpringMVC实现AOP日志记录功能service注入异常为null的解决办法
    关于SpringBoot项目打包没有把依赖的jar包一起打包的解决办法
    JavaFx项目打包成exe,并集成Jre,使Java项目在任意机器运行
    常用正则表达式
    SqlServer 2005及其以上版本能用的查询数据的行号
    js 中的倒计时功能
    数据库删除重复列
    【转】svn文件清除批处理工具
    JS获取当前页面名称
    sql 去除重复记录
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/3913761.html
Copyright © 2020-2023  润新知