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

原创 2013年08月22日 15:28:06

题目大意:通俗点讲就是,输出所有从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);
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hdu 2182 哈密顿绕行世界问题 搜索 dfs

题目链接:here 分析:很简单一个搜索。。。直接暴搜即可。。不知道为啥夏天的风把他分类到level1.。。。 代码: #include #include using namespace s...

hdu(2181):哈密顿绕行世界问题,dfs遍历

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 此题真的是一个水题,当然也只有这种题目才给了我前进的动力,要是一直被各种打压,岂不得累死! ...

hdu 2181 哈密顿绕行世界问题 ——dfs

题目: F - 哈密顿绕行世界问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi...

HDU2181:哈密顿绕行世界问题(DFS) (C)

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。    Input 前20行的第i行...

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

哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota...
  • khn64
  • khn64
  • 2017年07月29日 20:57
  • 67

DFS深度优先搜索(3)--hdu2181(哈密顿绕行世界问题)(基础题)

哈密顿绕行世界问题                                 Time Limit:1000MS    Memory Limit:32768KB    64bit IO F...

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

该题乍看很难的样子,其实就是个水DFS,因为要打印所有可能方案,所以无法剪枝,直接遍历所有可能情况就行。 细节参见代码: #include #include #include #include #...

HDU - 2181 哈密顿绕行世界问题(简单dfs)

一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。 简单的dfs,注意输出路径的处理。...

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

哈密顿绕行世界问题Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Problem Description 一个规则的实心...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(step4.3.8)hdu 2181(哈密顿绕行世界问题——DFS)
举报原因:
原因补充:

(最多只允许输入30个字)