NOJ 网络赛 B题 pdf的旅游

题目:

pdf的旅游

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 108            测试通过 : 26 

题目描述

a协有一位pdf是一位旅(作)游(死)爱好者,曾经在出去比赛之后拐带学弟翘课一周,四处旅游。

最近pdf又突发奇想,想再出去旅游一次。出去旅游之前当然要好好计划一番。Pdf给自己想去的地方并给它们编好了号(起点为1)。为了不跟自己过不去,pdf提前找出哪些地点存在交通方便的路径,而且只会走这些路径。

为了旅途乐趣的最大化,pdf希望每个地点都到访过的同时,又保证来去都不会走重复的路,而且最终还要回到起点。问想要达到上述要求,pdf应该怎么样安排地点的访问顺序。



输入

第一行一个整数t,表示数据组数。

每组数据的第一行两个整数nm分别表示地点数和路径数。(2≤n≤10,n≤m≤n(n-1)/2)

接下来的m行每行两个整数x表示xy之间交通方便。(保证两点之间只会有一条路)(1x,yn)

输出

每组数据输出一行,从起点开始的游览顺序。以空格分隔开。如果存在多解,则输出字典序最小的路径。(除起点外每个点只能访问一次)


样例输入

2
4 4
1 3
2 3
2 4
1 4

5 7
1 4
1 5
4 2
5 3
3 2
5 4
2 1

样例输出

1 3 2 4 1
1 2 3 5 4 1

题目来源

kojimai



题目分析:

                个人觉得这道题的问题模型符合“哈密尔顿图”的模型的。


代码如下:(以下代码能AC,我不知道是否正确理解了出题人的思路,仅供参考):

#include <iostream>
#include <cstdio>

using namespace std;


const int maxn = 155;
int map[maxn][maxn], n;
bool vis[maxn];
int ans[maxn];

bool dfs(int u, int dep) {
	int i;
	vis[u] = true;
	ans[dep] = u;
	if (dep == n) {
		vis[u] = false;
		if (map[1][u] == 1){
			return true;
		}else{
			return false;
		}
	}
	for (i = 1; i <= n; ++i){
		if (map[u][i] == 1 && !vis[i]){
			if (dfs(i, dep + 1)){
				return true;
			}
		}
	}
	vis[u] = false;
	return false;
}

int main() {
	int x, y, m;

	int cas;
	scanf("%d",&cas);

	while (cas--) {
		memset(map, 0, sizeof(map));
		memset(vis, false, sizeof(vis));
		scanf("%d%d",&n, &m);
		while (m--) {
			scanf("%d%d", &x, &y);
			map[x][y] = map[y][x] = 1;
		}
		if (!dfs(1, 1)) {
			continue;
		}
		for (int i = 1; i <= n; ++i){
			printf("%d ", ans[i]);
		}
		printf("1\n");
	}
	return 0;
}




你可能感兴趣的:(NOJ 网络赛 B题 pdf的旅游)