• 【CH0103】最短哈密顿路径


    题目大意:给定一个 N 个点的无向图,点有点权,求从 0 号点走到 N-1 号点的最短哈密顿路径是多少。

    题解:由于哈密顿路径的定义是每个顶点必须经过且仅能经过一次,因此,可用当前是否经过了这些点和当前在哪个点来表示出一个状态,则一共有 (O(n2^n)) 个状态。考虑转移方式,对于在 j 这个点的情况来说,可以从以下与 j 相邻的节点 k 转移来,k 必须满足在当前状态已经走到。因此,时间复杂度为 (O(n^22^n))

    update at 2019.3.29
    注意,由于状态转移方程为 $$dp[i][S]=min{dp[k][S']+dis(i,k)},kin [1,n],S'subset S$$,从中可以看出 i 的决策是不具有阶段性的,即:i 并不是从小到大进行的,而对于集合来说是从小到大进行转移的,因此应该以走过的点的集合作为阶段,即:集合应该是循环的第一层。今天被这个搞到自闭了。。QAQ

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    
    int dp[1<<20][20];
    int n,G[20][20];
    
    int main(){
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    			scanf("%d",&G[i][j]);
    	memset(dp,0x3f,sizeof(dp));
    	dp[1][0]=0;
    	for(int i=1;i<1<<n;i++)
    		for(int j=0;j<n;j++)if(i>>j&1)
    			for(int k=0;k<n;k++)if((i^1<<j)>>k&1)
    				dp[i][j]=min(dp[i][j],dp[i^1<<j][k]+G[k][j]);
    	printf("%d
    ",dp[(1<<n)-1][n-1]);
    	return 0;
    }
    
  • 相关阅读:
    Java-集合类源码List篇(二)
    规范输入
    Java 构造方法
    c语言函数实现交换两个数的值
    2015北京宇信易诚科技面试题
    Java中的访问控制
    2015大连华信校园招聘面试题--堆栈
    2015大连华信面试题OSI七层模型
    2015大连华信面试题二叉树、遍历
    2015大连华信面试题MVC框架
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10552681.html
Copyright © 2020-2023  润新知