• ACM-世界岛旅行


    【问题描述】

    某旅游公司组团去迪拜世界岛旅游。世界岛由n个岛屿组成,岛屿序号为1~n,这些岛屿都直接或间接相连。岛屿之间用桥梁连接。现从1号岛屿开始游览,并约定按如下方式游览:

    1) 每游览完一个岛屿,接下来游览与该岛屿有桥梁直接连接的、未游览过的岛屿。如果存在多个邻接的岛屿,则优先选择序号最小的岛屿。如果该岛屿没有未游览过的相邻岛屿,则返回到该岛屿的上一个岛屿。

    2) 每个岛屿都不会重复游览。

    另外,对每个岛屿,定义两个时间:

    1) 到达该岛屿的时间dfn1;

    2) 离开该岛屿的时间dfn2;

    时间从1开始计起,游览岛屿的时间不计,每到达一个岛屿,时间加1。如果到达某岛屿后由于没有未游览过的相邻岛屿而随即马上离开,则离开时时间也要加1,详见测试数据。

    【输入形式】

    输入文件中包含多个测试数据。每个测试数据的第一行为两个正整数n和m,2≤n≤20,分别表示岛屿数和桥梁数;接下来有m行,每行描述了一座桥梁,用该桥梁连接的两个岛屿序号表示;没有连接某个岛屿自身的桥梁,且任何两个岛屿之间最多有一座桥。输入文件最后一行为0 0,表示输入结束。

    【输出形式】

    对输入文件中的每个测试数据,输出两行,第1行为n个整数,用空格隔开,为第1~n个顶点的时间dfn1;第1行为n个整数,用空格隔开,为第1~n个顶点的时间dfn2。

    【样例输入】

    7 8
    1 4
    1 6
    1 7
    2 3
    2 7
    3 5
    3 6
    5 6
    0 0

    【样例输出】

    1 6 5 2 10 4 714 9 12 3 11 13 8

    
    

    【分析】

    题目不是很难,主要是把节点信息读入,然后利用dfs,关键是在过程中需要理清各节点d1和d2的关系。

    【代码】

    #include <stdio.h>
    #include <iostream>
    using namespace std;
    struct land {
        int d1;//登岛时间
        int d2;//离岛时间
    };
    bool maze[30][30];
    bool vist[30];
    land a[30];//记录实践
    int n, m;//岛数 桥数
    int length;
    int dfs(int c) {
        a[c].d2 = a[c].d1;
        int i = 1;
        int t = 0;
        for (i = 1; i <= n&&length; i++) {
            if (vist[i] == 0 && maze[c][i] == 1) {
                vist[i] = 1;
                length--;//未访问的岛数量减一
                a[i].d1 = a[c].d2 + 1;
                a[c].d2 = dfs(i);
                t = i;//记录此岛最后一个子岛
            }
        }
    
        //子岛访问完毕,开始回退
        if (t == 0)
            a[c].d2 = a[c].d1 + 1;//没有下一个可以旅行的岛
        else {
            a[c].d2 = a[t].d2 + 1;
            return a[c].d2;
        }
        return a[c].d2;
    }
    int main() {
        //freopen("in.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
        int i = 0;
        int j = 0;
        int z = 0;
        while (cin >> n >> m) {
            if (n == 0 && m == 0)
                break;
            for (i = 1; i <= n; i++) {
                for (j = 1; j <= n; j++) {
                    maze[i][j] = 0;
                }
                a[i].d1 = 0;
                a[i].d2 = 0;
                vist[i] = 0;
            }
            while (m > 0) {
                int x;
                int y;
                cin >> x >> y;
                maze[x][y] = 1;
                maze[y][x] = 1;
                m--;
            }
            //dfs
            a[1].d1 = 1;
            vist[1] = 1;
    length = n - 1; dfs(
    1); //输出答案 if (z != 0) printf(" "); for (i = 1; i <= n; i++) { printf("%d", a[i].d1); if (i + 1 <= n) printf(" "); } printf(" "); for (i = 1; i <= n; i++) { printf("%d", a[i].d2); if (i + 1 <= n) printf(" "); } z++; } return 0; }
    
    

    有不懂的地方,或是有自己的想法,欢迎在下面留言!

     
  • 相关阅读:
    数据库中索引的概念
    将博客搬至CSDN
    数据结构之图(图的基本操作)
    数据结构之图(图的简介)
    数据结构树之红黑树
    图解数据结构树之AVL树
    排序算法之选择排序
    数据结构树之二分查找树
    Kali-Dos洪水攻击之Hping3
    Linux系统查看CPU使用率命令
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/9949876.html
Copyright © 2020-2023  润新知