HDU ACM 2181 哈密顿绕行世界问题->DFS(深度有限搜索)

分析:DFS即可。

#include<iostream>
using namespace std;

bool map[21][21];
bool vis[21];
int ans[21],num,m;

void init()
{
	int i,a;

	memset(map,false,sizeof(map));
	for(i=1;i<=20;i++)           //构图
	{
		map[i][cin>>a,a]=true;
		map[i][cin>>a,a]=true;
		map[i][cin>>a,a]=true;
	}
}

void dfs(int d,int x,int s)
{
	int i;

	ans[d]=x;
	if(d==19)
	{
		if(!map[x][m]) return ;
		cout<<++num<<": ";
		for(i=0;i<=d;i++)
			cout<<" "<<ans[i];
		cout<<" "<<ans[0]<<endl;
		return ;
	}
	for(i=1;i<=20;i++)
		if(map[x][i] && !vis[i])
		{
			vis[i]=true;
			dfs(d+1,i,s);
			vis[i]=false;
		}
}

int main()
{
	ios::sync_with_stdio(false);
	init();
	while(cin>>m && m)
	{
		memset(vis,false,sizeof(vis));
		num=0;
		vis[m]=true;
		dfs(0,m,m);
	}
    return 0;
}
时间: 2024-08-02 17:34:15

HDU ACM 2181 哈密顿绕行世界问题->DFS(深度有限搜索)的相关文章

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

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

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

哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1517    Accepted Submission(s): 967 Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数

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

题意:给出一个十二面体,它的每个顶点是一个城市,从一个城市m出发并回到m,输出所有可行的路径 先把边记录下来,再深搜 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set>

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

Sample Input 2 5 20 1 3 12 2 4 10 3 5 8 1 4 6 5 7 19 6 8 17 4 7 9 8 10 16 3 9 11 10 12 15 2 11 13 12 14 20 13 15 18 11 14 16 9 15 17 7 16 18 14 17 19 6 18 20 1 13 19 5 0 Sample Output 1 #include <iostream> 2 3 using namespace std; 4 5 int Map[21][21

HDU 2181 哈密顿绕行世界问题

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

DFS HDOJ 2181 哈密顿绕行世界问题

题目传送门 题意:中文题面 分析:直接排完序后DFS.这样的题以后不应该再写题解的. #include <bits/stdc++.h> using namespace std; vector<int> G[21]; int ans[21]; int v[3]; bool vis[21]; int cnt; void print() { printf ("%d: ", ++cnt); for (int i=0; i<20; ++i) { printf (&q

哈密顿绕行世界问题(dfs+记录路径)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2362    Accepted Submission(s): 1490 Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的

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

题目传送门 C - 哈密顿绕行世界问题 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

哈密顿绕行世界问题

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output