标签:
3 3 0 0 0 0 100 0 0 0 0 2 2 1 1 1 1
4 4
解题:TSP问题
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int INF = 0x3f3f3f3f; 4 const int maxn = 11; 5 int n,m,d[maxn][maxn],dp[1<<maxn][maxn],tot; 6 struct Point { 7 int x,y; 8 Point(int a = 0,int b = 0){ 9 x = a; 10 y = b; 11 } 12 } p[maxn]; 13 int calc(int a,int b){ 14 return abs(p[a].x - p[b].x) + abs(p[a].y - p[b].y); 15 } 16 int main() { 17 int tmp; 18 while(~scanf("%d%d",&n,&m)) { 19 tot = 1; 20 for(int i = 1; i <= n; ++i) 21 for(int j = 1; j <= m; ++j) { 22 scanf("%d",&tmp); 23 if(tmp) p[tot++] = Point(i,j); 24 } 25 p[0] = Point(1,1); 26 for(int i = 0; i < tot; ++i) 27 for(int j = i; j < tot; ++j) 28 d[i][j] = d[j][i] = calc(i,j); 29 memset(dp,0x3f,sizeof dp); 30 dp[1][0] = 0; 31 int s = (1<<tot); 32 for(int i = 1; i < s; ++i){ 33 for(int j = 0; j < tot; ++j){ 34 if(dp[i][j] == INF) continue; 35 for(int k = 0; k < tot; ++k){ 36 if(((i>>k)&1) == 0 && dp[i|(1<<k)][k] > dp[i][j] + d[j][k]) 37 dp[i|(1<<k)][k] = dp[i][j] + d[j][k]; 38 } 39 } 40 } 41 int ret = INF; 42 for(int i = 0; i < tot; ++i) 43 ret = min(dp[s-1][i] + d[i][0],ret); 44 printf("%d\n",ret); 45 } 46 return 0; 47 }
HDU 5067 Harry And Dig Machine
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4764638.html