-
A - 旅行商问题(TSP)
- POJ - 3311
- 题意:一个送外卖的人,要从0送去所有地点再回到0,每个点可以走任意多次求最短路
- 思路:floy求出最短路。状态压缩各种状态之间相互更新,
- 转移方程为:dp[i][j]=min(dp[i][j],dp[i^1<<(j-1)][k]+mmp[k][j]);
-
#include<stdio.h> #include<cstring> #include<iostream> using namespace std; #define maxn 15 #define inf 0x3f3f3f3f int mmp[maxn][maxn],ans; int n,dp[1<<11][maxn]; int main() { while(~scanf("%d",&n)) { ans=inf; if(n==0) break; for(int i=0; i<=n; i++) for(int j=0; j<=n; j++) scanf("%d",&mmp[i][j]); for(int k=0; k<=n; k++) for(int i=0; i<=n; i++) for(int j=0; j<=n; j++) mmp[i][j]=min(mmp[i][j],mmp[i][k]+mmp[k][j]); memset(dp,inf,sizeof(dp)); for(int i=0; i<(1<<n); i++) { for(int j=1; j<=n; j++) { if(i&(1<<(j-1))) { if(i==1<<(j-1)) dp[i][j]=mmp[0][j]; else { for(int k=1; k<=n; k++) if(k!=j&&i&1<<(k-1)) dp[i][j]=min(dp[i][j],dp[i^1<<(j-1)][k]+mmp[k][j]); } } ans=min(ans,dp[(1<<n)-1][j]+mmp[j][0]); } } printf("%d\n",ans); } return 0; }
A - 旅行商问题(TSP) -状压DP
最新推荐文章于 2025-06-27 12:01:22 发布