hdu4856 西安邀请赛 bfs+状态压缩dp巧妙转换

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 int xx[]={0,0,1,-1};
 7 int yy[]={-1,1,0,0};
 8 int vis[16][16],dis[16][16],sx[16],sy[16],ex[16],ey[16],n,m;
 9 int dp[100005][16];
10 char mapp[16][16];
11 struct dian
12 {
13     int x,y,step;
14 };
15 void bfs(int from,int to,int px,int py,int qx,int qy)
16 {
17     memset(vis,0,sizeof(vis));
18     queue<dian>q;
19     dian n1,n2;
20     n1.x=px; n1.y=py; n1.step=0; vis[px][py]=1;
21     while (!q.empty()) q.pop();
22     q.push(n1);
23     while (!q.empty())
24     {
25         n1=q.front(); q.pop();
26         if (n1.x==qx&&n1.y==qy) {dis[from][to]=n1.step; return; }
27         for (int i=0;i<4;i++)
28         {
29             n2.x=n1.x+xx[i];
30             n2.y=n1.y+yy[i];
31             n2.step=n1.step+1;
32             if (n2.x<0||n2.x>=n||n2.y<0||n2.y>=n||vis[n2.x][n2.y]||mapp[n2.x][n2.y]=='#') continue;
33             vis[n2.x][n2.y]=1;
34             q.push(n2);
35         }
36     }
37     dis[from][to]=100000;
38     return;
39 }
40 int main()
41 {
42     int i,j,k,min,sta;
43     while (~scanf("%d%d",&n,&m))
44     {
45         for (i=0;i<n;i++){getchar(); scanf("%s",mapp[i]); }
46         for (i=0;i<m;i++) {
47                 scanf("%d%d%d%d",&sx[i],&sy[i],&ex[i],&ey[i]);
48                 sx[i]--; sy[i]--; ex[i]--; ey[i]--;
49         }
50         for (i=0;i<m;i++)
51             for (j=0;j<m;j++)
52             bfs(i,j,ex[i],ey[i],sx[j],sy[j]);
53         for (i=1;i<(1<<m);i++)
54             for (j=0;j<m;j++)
55             if ((i&(1<<j))!=0)
56         {
57             sta=i^(1<<j);
58             min=0x3f3f3f3f;
59             for (k=0;k<m;k++)
60                 if (((sta&(1<<k))!=0)&&(dp[sta][k]+dis[k][j]<min)) min=dp[sta][k]+dis[k][j];
61             if (min==0x3f3f3f3f) dp[i][j]=0;
62             else dp[i][j]=min;
63         }
64         min=0x3f3f3f3f;
65         for (i=0;i<m;i++)
66             if (dp[(1<<m)-1][i]<min) min=dp[(1<<m)-1][i];
67         if (min>10000) printf("-1\n");
68         else printf("%d\n",min);
69     }
70 }

http://acm.hdu.edu.cn/showproblem.php?pid=4856

posted on 2014-09-03 17:06  xiao_xin  阅读(91)  评论(0编辑  收藏  举报

导航