TSP問題(狀壓DP+Floyd解決方式)
阿新 • • 發佈:2019-01-05
目標演算法:狀態壓縮DP+Floyd
應用範圍:TSP
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int map[12][12]; int dp[1<<11][12]; int n,ans,Min; const int Inf = 0x3f3f3f; int main() { while(~scanf("%d",&n) && n) { for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { scanf("%d",&map[i][j]); } } for(int k=0;k<=n;k++) { for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { map[i][j] = min(map[i][j],map[i][k]+map[k][j]); } } } for(int s=0;s<=(1<<n)-1;s++) { for(int i=1;i<=n;i++) { if(s & (1<<(i-1))) { if(s == (1<<(i-1))) dp[s][i] = map[0][i]; else { dp[s][i] = Inf; for(int j=1;j<=n;j++) { if(s & (1<<(j-1)) && j != i) dp[s][i] = min(dp[s^(1<<(i-1))][j]+map[j][i],dp[s][i]); } } } } } ans = dp[(1<<n)-1][1] + map[1][0]; for(int i=2;i<=n;i++) { if(dp[(1<<n)-1][i] + map[i][0] < ans) ans = dp[(1<<n)-1][i] + map[i][0]; } printf("%d\n",ans); } }