http://acm.hdu.edu.cn/showproblem.php?pid=4856
有若干管道,每个管道有且只能走一次,而地图可以随意走。
那么可以先处理每个管道间的最短路(不要考虑借助其他管道的情况,因为随后我们用压位的方式可以很轻松地处理不走重复管道的问题,这里不应该引入过多干扰)。
随后我们把每个管道是否访问看作01序列,dp[i][j]看着当前处于j号管道,访问状态为i。然后预先加入当且访问一个管道的m个状态,做bfs即可(很多人做了三重循环,个人不太会那么犀利的操作,只会bfs直观一点hhh,不过两个bfs搞得代码很丑就是了)。
#include#include #include #include using namespace std;const int N=1005;const int inf=99999999;int n,m;string mp[20];int vis[20][20];struct p{ int x,y;};p in[20],ou[20];int d[20][20];struct node{ int s; p po;};int dir[4][2]={ 1,0,-1,0,0,1,0,-1};bool ok(p px){ if(px.x<0||px.y<0)return 0; if(px.x>=n||px.y>=n)return 0; if(vis[px.y][px.x]) return 0; if(mp[px.y][px.x]=='#')return 0; return 1;}void bfs(int np){ queue q; node ii; ii.s=0; ii.po=ou[np]; q.push(ii); memset(vis,0,sizeof vis); vis[ii.po.y][ii.po.x]=1; d[np][np]=0; while(!q.empty()) { node now=q.front(); q.pop(); for(int i=0;i >n>>m) { for(int i=0;i >mp[i]; for(int i=0;i >in[i].y>>in[i].x>>ou[i].y>>ou[i].x; in[i].x--; in[i].y--; ou[i].x--; ou[i].y--; } for(int i=0;i q; int ad=0; for(int i=0;i dp[now.d][now.po]+d[now.po][nx.po]) { dp[nx.d][nx.po]=dp[now.d][now.po]+d[now.po][nx.po]; q.push(nx); } } } } int ans=inf; for(int i=0;i =inf)cout<<-1<