【问题描述】

某旅游公司组团去迪拜世界岛旅游。世界岛由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[][];
bool vist[];
land a[];//记录实践
int n, m;//岛数 桥数
int length;
int dfs(int c) {
a[c].d2 = a[c].d1;
int i = ;
int t = ;
for (i = ; i <= n&&length; i++) {
if (vist[i] == && maze[c][i] == ) {
vist[i] = ;
length--;//未访问的岛数量减一
a[i].d1 = a[c].d2 + ;
a[c].d2 = dfs(i);
t = i;//记录此岛最后一个子岛
}
} //子岛访问完毕,开始回退
if (t == )
a[c].d2 = a[c].d1 + ;//没有下一个可以旅行的岛
else {
a[c].d2 = a[t].d2 + ;
return a[c].d2;
}
return a[c].d2;
}
int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int i = ;
int j = ;
int z = ;
while (cin >> n >> m) {
if (n == && m == )
break;
for (i = ; i <= n; i++) {
for (j = ; j <= n; j++) {
maze[i][j] = ;
}
a[i].d1 = ;
a[i].d2 = ;
vist[i] = ;
}
while (m > ) {
int x;
int y;
cin >> x >> y;
maze[x][y] = ;
maze[y][x] = ;
m--;
}
//dfs
a[].d1 = ;
vist[] = ;
length = n - 1;
dfs(); //输出答案
if (z != )
printf("\n");
for (i = ; i <= n; i++) {
printf("%d", a[i].d1);
if (i + <= n)
printf(" ");
}
printf("\n");
for (i = ; i <= n; i++) {
printf("%d", a[i].d2);
if (i + <= n)
printf(" ");
}
z++;
}
return ;
}

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

 

ACM-世界岛旅行的更多相关文章

  1. (转)一个大牛的acm历程(看着就要颤抖)

    从我接触程序竞赛到现在应该有十多年了,单说ACM竞赛,从第一次非正式参赛到现在也差不多有7年多的样子.有太多的故事,想说的话,却一直没能有机会写下来.一方面是自己忙,一方面也是自己懒.所以很感谢能有人 ...

  2. 我的ACM参赛故事

    从我接触程序竞赛到现在应该有十多年了,单说ACM竞赛,从第一次非正式参赛到现在也差不多有7年多的样子.有太多的故事,想说的话,却一直没能有机会写下来.一方面是自己忙,一方面也是自己懒.所以很感谢能有人 ...

  3. 九度OJ 1339:ACM (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:712 解决:379 题目描述: 今年的ACM世界总决赛快要开始了,需要有一个排名算法来对每支队伍进行现场排名.ACM组委会把这个任务交给了你 ...

  4. G - 旅行的意义(概率DP) (DAG图的概率与期望)

    为什么有人永远渴望旅行,或许就因为,巧合和温暖会在下一秒蜂拥而至吧. 一直想去旅游的天天决定在即将到来的五一假期中安排一场环游世界的旅行.为此,他已经提前查阅了很多资料,并准备画一张旅游路线图.天天先 ...

  5. How to Read a Book

    主题: 讲述阅读的四种层次,以及每种层次所需要的.截然不同的阅读方法. 主要声明与论点: 带着问题阅读,时刻不忘在书中寻找问题的答案: 高速阅读,以最短的时间了解一本书的全貌,然后决定是否值得再次阅读 ...

  6. [ZT] 几大酒店集团美国Co-Brand信用卡比较(三)如何选择最适合你的酒店联名信用卡

    原文地址: http://www.3798.com/archives/596.html 接着对我们这种不是某个酒店忠诚客户的用户选择卡片进行分析.首先要强调的是,我们比较的是信用卡项目本身,而不是酒店 ...

  7. python-原始字符串,长字符串

    一  长字符串 在python中要表示跨行多行的字符串,可以使用较为简单粗暴的表达-----三引号.例如: str = ”’那时我们有梦, 关于文学, 关于爱情, 关于穿越世界的旅行. 如今我们深夜饮 ...

  8. 微信公众平台-文章-app:让创意变为现实,这30个小程序“凭什么”脱颖而出?

    ylbtech-微信公众平台-文章-app:让创意变为现实,这30个小程序“凭什么”脱颖而出? 1.返回顶部 1. 让创意变为现实,这30个小程序“凭什么”脱颖而出? 微信公开课 昨天 创意1:为多种 ...

  9. HDU ACM 2066 一个人的旅行

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

随机推荐

  1. Redis数据结构:SDS

    1. 简单动态字符串(simple dynamic string,SDS)是Redis的默认字符串表示结构,底层的string都是基于SDS实现.Redis基于C语言,并引用了部分C函数. 使用场景: ...

  2. Linux crontab使用及注意事项

    渗透测试中,经常会用到crontab来执行计划任务,从而实现后门程序的隐藏,但crontab有几个坑点还是需要记录一下,方便日后使用时及时查询 1.crontab配置格式 # Example of j ...

  3. 剑指offer--43.连续子数组的最大和

    最大子段和,最大能取所有 ---------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度 ...

  4. TF随笔-7

    求平均值的函数 reduce_mean axis为1表示求行 axis为0表示求列 >>> xxx=tf.constant([[1., 10.],[3.,30.]])>> ...

  5. RMI垃圾收集简介

    和单机系统类似, 分布式系统也需要自动清除不再有客户端引用的对象(remote object). 远程对象的自动垃圾回收机制, 将程序员从深坑中解放出来, 不再需要人工跟踪client所引用的对象了. ...

  6. scrapy与scrapyd安装

    Scrapy是用python编写的爬虫程序. Scrapyd是一个部署与运行scrapy爬虫的应用,提供JSON API的调用方式来部署与控制爬虫 . 本文验证在fedora与centos是安装成功. ...

  7. Linux 中断处理

    HardIRQ 和 softirq : http://www.it165.net/os/html/201211/3766.html 博文:http://blog.csdn.net/yin262/art ...

  8. jquery动态增加或删除tr和td【实际项目】

    难点: (1)动态增加.删除tr和td (2)每天tr和td都有下标,且下标要动态变化, (3)tr和td为什么下标不能随便写,原因是此处需要把所有tr中的数据以list的形式发送到后台对象中,所有每 ...

  9. 遍历list方法

    [理论] for(String s : list){   System.out.print(s+"/t");  }    for(int i = 0;i<list.size( ...

  10. LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】

    LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...