栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

洛谷P1171 售货员的难题 题解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

洛谷P1171 售货员的难题 题解

洛谷P1171 售货员的难题 题解

题目链接:P1171 售货员的难题

题意:TSP问题。

某乡有 n n n个村庄( 1 < n ≤ 20 1

题目应该保证了有解。

经典的状压dp

设 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示目前走过的结点的状态为 i i i ,现在在 j j j 结点

则有

dp[i][j]=min(dp[i][j],dp[i^(1<<(j-1))][k]+g[k][j])

代码:

#include 
using namespace std;
// #define int long long
// #define INF 0x3f3f3f3f3f3f3f3f
#define N (int)((1<<20)+2)

int n,g[25][25],dp[N][22];
void Min(int &a,int b){if(b
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    memset(dp,0x3f,sizeof(dp));
    cin >> n;dp[1][1]=0;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            cin >> g[i][j];
    for(int i=1; i<1<>(j-1))&1 )
        for(int k=1; k<=n; k++)
        if( k!=j && ((i>>(k-1))&1) )
            Min(dp[i][j],dp[i^(1<<(j-1))][k]+g[k][j]);
    int mn=0x3f3f3f3f;
    for(int i=1; i<=n; i++)
        Min(mn,dp[(1< 

转载请说明出处

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923609.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号