hdu 5418 Victor and World (最短哈密顿回路)

给你n个国家,m条路线:u_i与v_i之间的距离w_i。

输出从1号国家出发经过每个国家至少一次再回到1号国家的最短距离。

【官方题解】:

我们首先需要预处理出任意两个国家之间的最短距离,因为数据范围很小,所以直接用Floyd就行了。

之后,我们用f[S][i]表示访问国家的情况为S,当前最后访问的一个国家是i所需要的最小总油量,其中,S的二进制表示记录了访问国家的情况,S在二进制表示下的第i位(不管是从左往右还是从右往左都可以)。如果是1则表示第i个国家被访问过了,否则表示第i个国家没有被访问过。

如dp[13][3](13=1101表示现有城市1、3、4)表示从城市1到城市3的最短路(可能经过城市4)。

那么状态转移方程:

f[S|(1<<i)][i]=min(f[S][j]+f[i][j]),
其中,S这个状态不包含i城市但包含j城市。即i和j满足S&(1<<j)=1且S&(1<<i)=0。

最开始时,除了f[1][1]是0,其他情况都是无穷大,之后先枚举S,再枚举i(我验题的时候因为这里搞反结果WA了),那么最终的答案就是

min(f[(1<<n)-1][i]+f[i][1]),其中i∈ [2,n]。

总复杂度为O(n^3+n^2*2^n)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <stack>
#include <queue>
#include <set>
#include <map>
typedef long long ll;

using namespace std;

const int inf=0x3f3f3f3f;
const int maxn=1e6+10;

int m,n;
int g[20][20];
int dp[maxn][20];

void floyd(){
	for(int k=1;k<=n;++k){
		for(int i=1;i<=n;++i){
			for(int j=1;j<=n;++j){
				g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
			}
		}
	}
}

int main()
{

	int t;
	scanf("%d",&t);
	while(t--){
		memset(g,inf,sizeof g);

		scanf("%d %d",&n,&m);
		int u,v,w;
		for(int i=0;i<m;i++){
			scanf("%d %d %d",&u,&v,&w);
			if(g[u][v] > w){
				g[u][v]=g[v][u]=w;
			}
		}

		if(n == 1){
            cout<<0<<endl;
            continue;
        }  

		floyd();
		for(int i=1;i<=n;++i)g[i][i]=0;

		memset(dp,inf,sizeof dp);
		dp[1][1]=0;

		for(int s=1;s< (1<<n) ; ++s ){
			for(int i=1;i<=n;++i){
				if(s&(1<<(i-1))){//s中包含i
					for(int j=1;j<=n;++j){
						if( (s&(1<<(j-1)))==0 ){//s中不包含j
							int tt= (s | (1<<(j-1)) );//tt为s包含j的状态
							dp[tt][j]=min(dp[tt][j],dp[s][i]+g[i][j]);
						}
					}
				}

			}
		}
		//printf("%d\n",g[n][1] );
		int ans=inf;
        for(int i=2;i<=n;i++)
        	ans=min(ans,dp[ (1<<n) -1 ][i]+g[i][1]);
        printf("%d\n",ans);
	}

}

  

时间: 2024-10-11 06:47:42

hdu 5418 Victor and World (最短哈密顿回路)的相关文章

ACM: HDU 5418 Victor and World - Floyd算法+dp状态压缩

HDU 5418 Victor and World Time Limit:2000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u After trying hard for many years, Victor has finally received a pilot license. To have a celebration, he intends to buy himself an airplane and fl

HDU 5418 Victor and World 允许多次经过的TSP

题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5418 bestcoder(中文): http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=619&pid=1002 Victor and World Accepts: 99 Submissions: 644 Time Limit: 4000/2000 MS (Java/Others) Memory Limi

HDU 5418 Victor and World (状态压缩dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 题目大意:有n个结点m条边(有边权)组成的一张连通图(n <16, m<100000).求从第一个点出发,经过每个点至少一次后回到原点的最小路径边权和. 分析:发现我还真是菜. n<16,很明显的状态压缩标记,先将所有点的编号减去1,使其从0开始编号.dp[i][j]表示从0号点出发,当前状态为i (二进制位为1表示对应点已走过,否则没走过), 当前位置为 j,  回到原点的最小代价,

BestCoder Round #52 (div.2) HDU 5418 Victor and World (DP+状态压缩)

[题目链接]:click here~~ [题目大意]: 问题描写叙述 经过多年的努力,Victor最终考到了飞行驾照. 为了庆祝这件事,他决定给自己买一架飞机然后环游世界. 他会驾驶一架飞机沿着规定的航线飞行.在地球上一共同拥有nn个国家,编号从11到nn.各个国家之间通过mm条双向航线连接,第ii条航线连接第u_iu?i??个国家与第v_iv?i??个国家,通过这条航线须要消耗w_iw?i??升油.且从11号国家能够直接或间接到达22到nn中随意一个国家. Victor一開始位于11号国家.他

HDU 5418——Victor and World——————【状态压缩+floyd】

Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others)Total Submission(s): 891    Accepted Submission(s): 399 Problem Description After trying hard for many years, Victor has finally received a pilot li

hdu 5418 Victor and World

click here~~ ***Victor and World*** Problem Description After trying hard for many years, Victor has finally received a pilot license. To have a celebration, he intends to buy himself an airplane and fly around the world. There are n countries on the

HDU 5417 Victor and Machine

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5417 Problem Description Victor has a machine. When the machine starts up, it will pop out a ball immediately. After that, the machine will pop out a ball every w seconds. However, the machine has some f

hdu 1242 到目的地的最短时间 dfs

到目的地的最短时间 Sample Input7 8#.#####.#.a#..r.#..#x.....#..#.##...##...#.............. Sample Output13 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 using namespace std; 7 8

HDU 5385(The path-构造最短路树)

The path Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 724    Accepted Submission(s): 277 Special Judge Problem Description You have a connected directed graph.Let d(x) be the length of the s