首页 > 其他分享 >AcWing—最短Hamilton路径

AcWing—最短Hamilton路径

时间:2024-03-29 20:58:35浏览次数:24  
标签:int 路径 距离 最短 ++ Hamilton 走过 AcWing

91. 最短Hamilton路径 - AcWing题库

所需知识:二进制状态压缩,动态规划

假设现在有六个点:

j/i012345
0024513
1206531
2460832
3558054
4133503
5312430

起点为0终点为5,假设现在走到终点前一点,不妨设该点为4,即现在要确定从0到4,最少要走多远,起点为1终点为4,现有六条路可以选择:

first: 0–>1–>2–>3–>4 距离:21
second: 0–>1–>3–>2–>4 距离:18
third: 0–>2–>1–>3–>4 距离:17
fourth: 0–>2–>3–>1–>4 距离:20
fifth: 0–>3–>1–>2–>4 距离:19
sixth: 0–>3–>2–>1–>4 距离:22

因为4到5的距离是确定的唯一值,所以0->4的最短路径即为0->5的最短路径,即为此例中的third。

所以得出结论,只要确定最后一点的前一点的最短路径即为答案所求最短路径,因此dp的思路有了,但怎么表示走过的路径还是一个问题,今天刚学了一种方法:状态压缩,用一个数的二进制表示是否走过这个点(1表示走过,0表示没走过)

状态转移方程式:f[i][j]=min(f[i][j],f[i-(1<<j)][k]+a[k][j]);

C++代码:

#include <iostream>
#include <cstring>

using namespace std;

const int N = 20,M=1<<N;
int a[N][N];
int n;
int f[M][N];
int main()
{
    cin>>n;
    for (int i = 0; i < n; i ++ ){
        for (int j = 0; j < n; j ++ ){
            cin>>a[i][j];
        }
    }
    memset(f,0x3f,sizeof f);
    f[1][0]=0;
    for (int i = 0; i <(1<<n); i ++ ){
        for (int j = 0; j < n; j ++ ){
            if((i>>j)&1)//判断某一个数的第j为是不是1(有没有经过j这个点)
            for (int k = 0; k < n; k ++ ){
                if((i>>k)&1)//(有没有经过k这个点)
                   f[i][j]=min(f[i][j],f[i-(1<<j)][k]+a[k][j]);
            }
        }
    }
    cout<<f[(1<<n)-1][n-1]<<endl;
    return 0;
}

标签:int,路径,距离,最短,++,Hamilton,走过,AcWing
From: https://blog.csdn.net/2301_81374681/article/details/137128458

相关文章

  • P1354 房间最短路问题
    原题链接题解1.最短路径一定可以表示成经过若干端点的线段,所以我们把端点单独提出来,这样就变成了计算几何形式的最短路2.如果两个端点能相连,代表他们之间没有墙阻挡code#include<bits/stdc++.h>usingnamespacestd;intn;struct{doublex,a1,b1,a2,b2;}wall[30];......
  • Acwing 129. 火车进栈
    https://www.acwing.com/problem/content/description/131/输入样例:3输出样例:123132213231321#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;constLLMAXN=1e18,MINN=-MAXN,INF=0x3f3f3f3f;constLLN=......
  • [正常题解]Acwing.5308 公路
    ​首先需要理解一个证明:​ 假设我们有三个点,前两个点价格为\(a_1,\a_2\),距离为\(v_1,\v_2\)那么就有式子:\(\frac{a_1\timesv_1}{d}+\frac{a_2\timesv_2}{d}\式①\),和式子\(\frac{a_1\timesv_1}{d}+\frac{a_1\timesv_2}{d}\式子②\)$\rightarrow\frac{1}{d}(......
  • Acwing 1111. 字母
    https://www.acwing.com/problem/content/1113/#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;constLLMAXN=1e18,MINN=-MAXN,INF=0x3f3f3f3f;constLLN=200200,M=2020;LLn,m,maxn=1;charc[M][M];ma......
  • Acwing 1491. 圆桌座位
    https://www.acwing.com/problem/content/1493/输入样例1:4112输出样例1:2输入样例2:10512345678910输出样例2:112512#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;constLLMAXN=1e18,MINN=-MAXN,I......
  • lanqiao106. 正则问题 (第八届蓝桥杯C++A组)或者 acwing 1225. 正则问题
    问题:知识补充:1. 正则表达式的计算①括号代表优先计算,②或符号代表二选一。比如给的例子:((xx|xxx)x|(x|xx))xx 2. 字符串的语法问题:string是字符串的类型,使用的时候也使像字符一样使用,加入定义stringstr,那么使用的时候要写成str[]思考:妈呀一开始我不会算正则表达......
  • Floyd算法 【多源最短路】模板
    B3647【模板】Floyd-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;constintN=1e2+10;constintinf=0x3f3f3f;intn,m;intg[N][N];voidfloyd(){for(intk=1;k<=n;k++){for(inti=1;i<=n;i++)......
  • 【图论】3.26学习记录 最短路/最长路 次短路
    最短路:SPFA:特点:代码短好写,负权边必备,可以判环,容易被卡成O(nm);code:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintMAXN=5e5+10;constintinf=2147483647;intdist[MAXN];intvis[MAXN];vector<pair<int,int>>e[MAXN];si......
  • AcWing 730. 机器人跳跃问题
    Problem:AcWing730.机器人跳跃问题文章目录思路解题方法复杂度Code思路这是一个二分查找的问题。我们需要找到机器人的最小初始能量,使得它能够完成所有的跳跃。我们可以通过二分查找来找到这个最小的初始能量。我们从最小能量1开始,到最大能量100000(因为题目中......
  • 最短Hamilton路径(状态压缩DP)
    给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1的最短Hamilton路径。Hamilton路径的定义是从 0 到 n−1不重不漏地经过每个点恰好一次。输入格式第一行输入整数 n。接下来 n 行每行 n 个整数,其中第 i 行第 j个整数表示点 i ......