#21. 求所有多路径

内存限制:1024 MiB 时间限制:2000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: hiram

题目描述

我们把形如 1->2 的路径称作表1到表2的关联,如果存在 1->2, 1->3, 2->4, 3->4, 那么表1到表4则有两条路径分别为: 1->2->4 1->3->4,

现给出一组关联(两表关联),计算这些表中的所有路径信息并输出

输入格式

用例为一个2列的文本文件,每一行代表着表->表的关联,如 1 2 则代表表1->表2的关联,两数据之间有空格,每行数据最后有换行符"\n",样例数据第一列的表id为顺序排列(1,2,3...)

输出格式

最终输出为对结果文本加密的一个MD5码。 其中结果文本每行数据第一列为起点表,第二列为终点表,随后将路径经过的表id依次列出(包括头尾),以冒号加空格隔开 如 1->5->6->11->2 则输出为 1 2: 1 5 6 11 2 两两数据间有空格,末尾有换行符"\n",最后一行也有换行符 对于这些字符串,输出要求排序,每行按字符串排序,即11 3: 11 4 3 在2 3: 2 4 3前面

对结果文本加密方法如下:

private static final char[] HEX_CHARS = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    public static String encrypt(String dataStr) {
        try {
            MessageDigest m = MessageDigest.getInstance("MD5");
            m.update(dataStr.getBytes("UTF8"));
            byte s[] = m.digest();
            String result = new String(encodeHex(s));
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    private static char[] encodeHex(byte[] bytes) {
        char[] chars = new char[32];

        for(int i = 0; i < chars.length; i += 2) {
            byte b = bytes[i / 2];
            chars[i] = HEX_CHARS[b >>> 4 & 15];
            chars[i + 1] = HEX_CHARS[b & 15];
        }
        return chars;
    }

样例

输入:

1 2
1 3
2 1
2 3
3 4
4 1

结果文本如下:

1 2: 1 2
1 3: 1 2 3
1 3: 1 3
1 4: 1 2 3 4
1 4: 1 3 4
2 1: 2 1
2 1: 2 3 4 1
2 3: 2 1 3
2 3: 2 3
2 4: 2 1 3 4
2 4: 2 3 4
3 1: 3 4 1
3 2: 3 4 1 2
3 4: 3 4
4 1: 4 1
4 2: 4 1 2
4 3: 4 1 2 3
4 3: 4 1 3

对结果文本加密后的最终输出:

4c0c3de66f4d6a1021f2e82669e3ab29

数据范围与提示

表以及关联数量在1000以下