ACM-世界岛旅行

Posted woxiaosade

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; i++){
        if (vist[i] == 0 && maze[c][i]==1){
            vist[i] = 1;
            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 && length ; i++) {
            for (j = 1; j <= n; j++){
                maze[i][j] = 0;
            }
            a[i].d1 = 0;
            a[i].d2 = 0;
            vist[i] = 0;
            length--;//记录剩余未访问岛的个数
        }
        while (m > 0){
            int x;
            int y;
            cin >> x >> y;
            maze[x][y] = 1;
            maze[y][x] = 1;
            m--;
        }
        length = n;
        a[1].d1 = 1;
        vist[1] = 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;
}

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

 

以上是关于ACM-世界岛旅行的主要内容,如果未能解决你的问题,请参考以下文章

张江人工智能岛 和时代同步 与梦想着前行 为世界带来改变

旅行计划

HDU 2066 一个人的旅行

ACM 海贼王之伟大航路(深搜剪枝)

《开源世界旅行手册》摘要

nefu-1297 表哥的旅行(最短路问题)