zoukankan      html  css  js  c++  java
  • Victor and World 状压dp

      就是旅行商问题

    给出一张无向图  要求从1号点开始遍历所有的点最后再回到一号点   总的距离最短

    因为数据小  先跑一边floyd  

    显然想要算路径要求明确两个点     转移的目标点是明确的   但另一个点需要开一维dp来记录

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define pb push_back
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    const int N=20;
    int mp[N][N];
    int n,m,a,b,c;
    int dp[1<<N][N];
    
    int main()
    {
        int cas;RI(cas);
        while(cas--)
        {
            RII(n,m);
            rep(i,1,n)rep(j,1,n)if(i!=j)mp[i][j]=inf;else mp[i][j]=0;
    
            rep(i,1,m)
            {
                RIII(a,b,c);
                if(c<mp[a][b])mp[a][b]=mp[b][a]=c;
            }
            rep(k,1,n)
            rep(i,1,n)
            rep(j,1,n)
            mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
    
            CLR(dp,0x3f);
            dp[1][1]=0;
            rep(i,1,(1<<n)-1)
            {
                rep(j,1,n)
                {
                    if(i&(1<<(j-1)))continue;
                    int now=i|(1<<(j-1));
                    rep(k,1,n)
                    if(i&(1<<(k-1)))
                    {
                        dp[now][j]=min(dp[now][j],dp[i][k]+mp[k][j]);
                    }
                }
            }
            int minn=inf;
            rep(i,1,n)
            minn=min(minn,dp[(1<<n)-1][i]+mp[1][i] );
            cout<<minn<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    leetcode--Populating Next Right Pointers in Each Node II
    leetcode—Populating Next Right Pointers in Each Node
    Pascal's Triangle II
    leetcode—pascal triangle
    leetcode—triangle
    October 23rd, 2017 Week 43rd Monday
    October 22nd, 2017 Week 43rd Sunday
    October 21st 2017 Week 42nd Saturday
    October 20th 2017 Week 42nd Friday
    October 19th 2017 Week 42nd Thursday
  • 原文地址:https://www.cnblogs.com/bxd123/p/10900742.html
Copyright © 2011-2022 走看看