zoukankan      html  css  js  c++  java
  • 旅行商问题 状压DP

    题目:     给定一个n个顶点组成的带权有向图的距离矩阵d(i,j)(INF 表示没有边)。要求从顶点0出发,经过每个顶点恰好一次后再回到顶点0 问所经过的峨边权重的最小值是多少

    5 8
    0 1 3
    0 3 4
    1 2 5
    2 0 4
    2 3 5
    3 4 3
    4 1 6
    4 0 7

    22

    状压DP解法:代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<algorithm>
    #include<map>
    #define maxn 2005
    #define inf 1000000007
    typedef long long ll;
    using namespace std;
    int d[maxn][maxn];
    int dp[maxn][maxn];
    int a,b,c,n,m;
    void solve()
    {
        for(int s=0;s<1<<n;s++)
        {
            fill(dp[s],dp[s]+n,inf);
        }
        dp[(1<<n)-1][0]=0;
        for(int s=(1<<n)-2;s>=0;s--)
            for(int v=0;v<n;v++)
            for(int u=0;u<n;u++)
        {
            if(!(s>>u&1))
            {
                dp[s][v]=min(dp[s][v],dp[s|1<<u][u]+d[v][u]);
            }
        }
        printf("%d
    ",dp[0][0]);
    }
    int main()
    {
        cin>>n>>m;
        for(int i=0;i<n;i++)
        fill(d[i],d[i]+n,inf);
        for(int i=0;i<m;i++)
        {
            cin>>a>>b>>c;
            d[a][b]=c;
        }
        solve();
        return 0;
    }
  • 相关阅读:
    Windows下安装redis
    flask-redirect
    MySQLHelper
    配置信息
    注释习惯
    SQL2012 附加数据库提示5120错误解决方法
    Union-SQL Server学习笔记
    存储过程
    模糊查询&&日期时间操作
    数据库表的设计
  • 原文地址:https://www.cnblogs.com/huangzzz/p/9294225.html
Copyright © 2011-2022 走看看