zoukankan      html  css  js  c++  java
  • poj 3311 经典tsp问题,状压dp

    题目链接:Hie with the Pie

    解题思路:

    Floyd + 状态压缩DP
    题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且距离最短
    也就是TSP(旅行商)问题,首先不难想到用FLOYD先求出任意2点的距离dis[i][j]
    接着枚举所有状态,用11位二进制表示10个城市和pizza店,1表示经过,0表示没有经过
    定义状态DP(S,i)表示在S状态下,到达城市I的最优值
    接着状态转移方程:DP(S,i) = min{DP(S^(1<<i-1),k) + dis[k][j],DP(S,i)},其中S^(1<<i-1)表示未到达城市i的所有状态,1<=k<=n
    对于全1的状态,即S = (1<<n)-1则表示经过所有城市的状态,最终还需要回到PIZZA店0,那么最终答案就是min{DP(S,i) + dis[i][0]}


    /*
    ************************************************************* Problem:poj 3311 User: youmi Language: C++ Result: Accepted Time:0MS Memory:736K ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue> #include <deque> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define scs(a) scanf("%s",a) #define sclld(a) scanf("%I64d",&a) #define pt(a) printf("%d ",a) #define ptlld(a) printf("%I64d ",a) #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define rep_1(i,n) for(int i=n;i>=1;i--) #define rep_0(i,n) for(int i=n-1;i>=0;i--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define lson (step<<1) #define rson (lson+1) #define esp 1e-6 #define oo 0x3fffffff #define TEST cout<<"*************************"<<endl using namespace std; typedef long long ll; int n; const int maxn=(1<<12); int dp[maxn][11]; int dis[11][11]; void floyd() { for(int k=0;k<=n;k++) for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j]; } void solve() { int bit=(1<<n)-1; for(int s=1;s<=bit;s++) { for(int i=1;i<=n;i++) { int temp=(1<<(i-1)); if(s&temp) { if(s==temp) dp[s][i]=dis[0][i]; else { dp[s][i]=oo; for(int j=1;j<=n;j++) if(s&(1<<(j-1))&&i!=j) dp[s][i]=Min(dp[s-temp][j]+dis[j][i],dp[s][i]); } } } } int ans=oo; for(int i=1;i<=n;i++) ans=Min(ans,dp[bit][i]+dis[i][0]); pt(ans); } int main() { //freopen("in.txt","r",stdin); while(~sc(n)&&n) { rep0(i,n+1) { rep0(j,n+1) { sc(dis[i][j]); } } floyd(); solve(); } return 0; }
    不为失败找借口,只为成功找方法
  • 相关阅读:
    MIRO校验过程
    SAP中寄售处理
    物料BOM和生产订单BOM的区别
    sap 中怎样把非限制库存转为销售订单库存?
    SAP MM Consignment 寄售库存
    SAP 库存关联表信息
    SAP 物料主数据屏幕增强
    __defineGetter__ && __defineSetter__
    mongodb(分片)
    mongodb(副本集)
  • 原文地址:https://www.cnblogs.com/youmi/p/4763127.html
Copyright © 2011-2022 走看看