BestCoder Round #14 B 題 Harry And Dig Machine 【TSP】,
題目:Harry And Dig Machine
哈哈 終於漲邊粉色了,不容易呀。順便寫一道題解吧
題意:給一個m*n的矩陣,然後其中最多由10個有值,求總左上方把所有的值都拿上回到左上方的最小步數。
標準的TSP回到原點問題,需要先預先處理出圖來,然後TSP即可。
AC代碼:
#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <iostream>#include <vector>#include <cmath>using namespace std;const int inf = 0x3f3f3f3f;const int N = 15;int mp[N][N];struct Node{ int x,y;};vector<Node> vv;int n,m;int dp[1<<N][N];int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++){ int x; scanf("%d",&x); if(x) vv.push_back((Node){i,j}); } } int okk = 0; for(int i=0;i<vv.size();i++) { if(vv[i].x==0 && vv[i].y==0) { okk=1; continue; } } if(okk==0) vv.push_back((Node){0,0}); for(int i=0;i<vv.size();i++) { for(int j=0;j<vv.size();j++) { mp[i][j] = 0; if(i==j) continue; mp[i][j] = abs(vv[i].x-vv[j].x) + abs(vv[i].y-vv[j].y); } } int len = vv.size(); n = len; for(int st=0;st<(1<<n);st++) //TSP { for(int i=0;i<n;i++) { if((st&(1<<i))==0) //Ϊ0 continue; if(st==(1<<i)){ dp[st][i]=mp[0][i];continue; } dp[st][i]=inf; for(int j=0;j<n;j++) { if((st&(1<<j)) && i!=j)//Ϊ1 { dp[st][i]=min(dp[st&~(1<<i)][j]+mp[j][i],dp[st][i]); } } } } int ans=inf; for(int i=0;i<n;i++){ ans=min(ans,dp[(1<<n)-1][i]+mp[i][0]); } printf("%d\n",ans); vv.clear(); } return 0;}