标签:des style blog http color io os ar java
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 320 Accepted Submission(s): 99
思路:哈密顿回路问题,dp[i][j] 表示状态为 i 时,最后一个节点是 j 时最短距离
状态的 i 的意思是,把 i 化为二进制,如果第 j 个点在里面,第j 位就为 1
比赛的时候,左右不分,也是醉了。。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<vector> #include<set> #include<stack> #include<map> #include<ctime> #include<bitset> #define LL long long #define maxn 110 #define INF 0x3f3f3f3f using namespace std; int mat[maxn][maxn],dis[150][150]; int map1[maxn][maxn], dp[(1<<10)+10][15] ; bool vi[50][50]; struct node { int x,y; }qe[100]; int main() { int i,j,k; int tmp,T,x,ans; int n,m,u; while(scanf("%d%d",&n,&m) != EOF) { for( i = 1 ; i <= n ;i++) for( j = 1 ; j <= m;j++) scanf("%d",&mat[i][j]) ; x = 0 ; for( i = 1 ; i <= n ;i++) for( j = 1 ; j <= m ;j++) { if(mat[i][j]>0){ qe[x].x = i ; qe[x].y = j ; map1[i][j]=x++; } else map1[i][j]=-1; } for( i = 1 ; i <= n ;i++) for( j = 1 ; j <= m ;j++)if(mat[i][j]>0) { for( k =0 ; k < x ;k++){ dis[map1[i][j]][map1[qe[k].x][qe[k].y]] = abs(qe[k].x-i)+abs(qe[k].y-j); } } memset(dp,INF,sizeof(dp)) ; for( i = 0 ; i < x;i++){ dp[1<<i][i] = abs(1-qe[i].x)+abs(1-qe[i].y); } for( i = 1 ; i < (1<<x);i++) for( j = 0 ; j < x ;j++)if(dp[i][j] != INF) { for( u = 0 ; u < x ;u++)if((i&(1<<u))==0) { dp[i|(1<<u)][u] = min(dp[i|(1<<u)][u],dis[j][u]+dp[i][j]) ; } } int ans=INF ; for( i = 0 ; i < x ;i++) { ans = min(ans,dp[(1<<x)-1][i]+abs(1-qe[i].x)+abs(1-qe[i].y)) ; } if(ans==INF)ans=0; printf("%d\n",ans); } return 0 ; }
hdu 5067 Harry And Dig Machine
标签:des style blog http color io os ar java
原文地址:http://www.cnblogs.com/20120125llcai/p/4034126.html