【DP】 POJ 3311 Hie with the Pie 状压 TSP问题
需要回到一起点
并且可以重复走同一条路
用队列模拟
#include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <cmath> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #define cler(arr, val) memset(arr, val, sizeof(arr)) typedef long long LL; const int MAXN = 100200; const int MAXM = 6000010; const int INF = 0x3f3f3f3f; const int mod = 1000000007; int dp[1<<11][12],a[11][11]; bool vis[1<<11][12]; int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif int n; while(cin>>n,n) { cler(dp,INF); cler(vis,false); for(int i=0; i<=n; i++) for(int j=0; j<=n; j++) cin>>a[i][j]; dp[1][0]=0; int ans=INF; queue<int>q1,q2; vis[1][0]=true; q1.push(1),q2.push(0); while(!q1.empty()) { int i=q1.front(),j=q2.front(); q1.pop(); q2.pop(); if(dp[i][j]==INF||(i&(1<<j))==0) continue; for(int k=0; k<=n; k++) { //if(vis[i|(1<<k)][k]) continue; if(dp[i|(1<<k)][k]>dp[i][j]+a[j][k]) { dp[i|(1<<k)][k]=dp[i][j]+a[j][k]; // cout<<i<<" "<<j<<" "<<(i|(1<<k))<<" "<<k<<" "<<dp[i|(1<<k)][k]<<endl; vis[i|(1<<k)][k]=true; q1.push(i|(1<<k)); q2.push(k); } } } cout<<dp[(1<<(n+1))-1][0]<<endl; } return 0; }