关闭

(step4.3.8)hdu 2181(哈密顿绕行世界问题——DFS)

标签: step4.3.8hdu 2181哈密顿
1082人阅读 评论(0) 收藏 举报
分类:

题目大意:通俗点讲就是,输出所有从m城市出发,便利所有城市之后又能回到m城市的序列......


解题思路:DFS

1)用map[][]来存储城市之间的连通情况.用used[]存储某个城市的使用情况(即某一个城市是否被访问过).用res[]保存路径

。如res[count] = dep ; 表示的是第count不访问的城市是dep。用cas表示目标城市的序号


代码如下:

/*
 * 2181_2.cpp
 *
 *  Created on: 2013年8月22日
 *      Author: Administrator
 */

#include <iostream>

using namespace std;

/**
 * map[][] :用来保存城市之间的连通情况
 * used[] :用来 保存城市的使用情况
 * res[] :用来保存路径
 * cas :目标城市的标号
 */
const int maxn = 21;
bool map[maxn][maxn];
bool used[maxn];
int res[maxn];
int cas;
int num = 1;

/**
 * dep :当前访问城市
 * count :当前访问的城市数
 */
void dfs(int dep, int count) {
	int i;

	//第count个所到达的城市是dep
	res[count] = dep;
	if (count == 19) { //19步能涉及20个城市
		if (map[dep][cas]) {
			printf("%d: ", num++);
			for (i = 0; i < 20; ++i) {
				printf(" %d", res[i]);
			}
			printf(" %d", cas);
			printf("\n");
		}

		return;
	}

	for (i = 1; i <= 20; ++i) {
		/**
		 * map[dep][j] :从城市dep到城市j的连通情况
		 */
		//如果城市dep与城市j连通&&城市j没有使用过
		if (map[dep][i] && !used[i]) {
			used[i] = true;
			dfs(i, count + 1);
			used[i] = false;
		}
	}
}
int main() {
	memset(map, 0, sizeof(map));
	memset(res, 0, sizeof(res));
	memset(used, false, sizeof(used));
	int i;
	int a, b, c;
	for (i = 1; i <= 20; ++i) {
		scanf("%d%d%d", &a, &b, &c);
		map[i][a] = true;
		map[i][b] = true;
		map[i][c] = true;
	}

	while (scanf("%d", &cas) != EOF, cas) {
		used[cas] = true;
		dfs(cas, 0);
	}
}


1
0
查看评论

HDU-2181 哈密顿绕行世界问题

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2181 题意: TSP问题,20个城市,每个城市与三个城市相连,输出从某个城市开始遍历所有城市的所有路径的字典序排列。 思路: 按字典序暴力dfs即可, 代码: #define N 25 i...
  • kopyh
  • kopyh
  • 2015-09-25 22:16
  • 543

hdu 2181 哈密顿绕行世界问题,深度优先搜索求解

http://acm.hdu.edu.cn/showproblem.php?pid=2181         这是我写的第一个博客,仅作为参考,大牛们见了不要见笑哈。         本题首先就是要建立一个城市连接的...
  • wchyumo2009
  • wchyumo2009
  • 2012-03-22 20:16
  • 2790

HDU2181---哈密顿绕行世界问题

#include #include using namespace std; int map[25][4],vis[25],des[25]; int n,cas=1; void dfs(int now,int num){ if(num>21) return; if(num==...
  • hy1405430407
  • hy1405430407
  • 2015-06-15 20:56
  • 462

哈密顿绕行世界问题

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。   Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m...
  • a997930294
  • a997930294
  • 2014-07-26 09:57
  • 1060

hdu2181C - 哈密顿绕行世界问题

http://acm.hdu.edu.cn/showproblem.php?pid=2181 这是一个dfs搜索题目,难点在于剪枝,以及路径还原;下面是给出代码及其详解 /* 回溯方法的深度理解 9->3->2->13->5->head pre[9]=3; pre[...
  • yuanjunlai141
  • yuanjunlai141
  • 2015-10-24 20:21
  • 294

HDU 2181 哈密顿绕行世界问题 (DFS)

题目链接:哈密顿绕行世界问题 解析:将每个点的相邻三个点按字典序存放,直接dfs即可。 AC代码: #include using namespace std; int city[30][5]; int vis[30]; int pre[30]; int m; int cnt; ...
  • u013446688
  • u013446688
  • 2015-09-09 19:51
  • 378

【DFS】hdu 2181 哈密顿绕行世界问题

#include #include #include #include #include using namespace std; int g[25][25], vis[25]; int road[25], num, m; void dfs(int point, int cnt) { ...
  • u013163567
  • u013163567
  • 2014-03-19 21:02
  • 311

HDOJ 2181 哈密顿绕行世界问题

题意:有二十个节点,求出不重复的遍历所有节点的所有路径,按字典序输出路径 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 思路:回溯+dfs 注意点:注意起点和终点的处理 以下为AC代码: #include #include ...
  • luminous11
  • luminous11
  • 2015-03-17 22:26
  • 281

hdu 2181 哈密顿绕行世界问题 (DFS~)

好久没写深搜了,套路都忘了。。。 #include #include #include #include using namespace std; #define MAX 30 int ans[MAX]; int map[MAX][3]; int vis[MAX]; int cases, ...
  • moon_CY
  • moon_CY
  • 2017-11-08 12:43
  • 59

哈密顿绕行世界问题 HDU - 2181 DFS

哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4900 Accepted Submission(s): 2...
  • khn64
  • khn64
  • 2017-07-29 20:57
  • 104
    个人资料
    • 访问:2082982次
    • 积分:34711
    • 等级:
    • 排名:第152名
    • 原创:1199篇
    • 转载:278篇
    • 译文:3篇
    • 评论:188条
    学习经历
    毕业学校:南京邮电大学本科
    成长的地方:创新工场、美团点评、阿里巴巴
    职位:游戏研发工程师、Android研发工程师
    《libGDX移动游戏开发从入门到精通》作者
    努力奋斗、快乐生活
    (阿里巴巴长期招收P6及以上,简历请发至1019648568@qq.com)
    博客专栏
    最新评论