您的位置:首页 > 其它

最短路的神奇用法 bzoj1550 避开怪兽

2017-07-23 21:23 323 查看
题意:略

题解:

这道题的最短路用法是把我看蒙蔽了,自己想出的思路也就是在最后求最短路那里断了的

首先用bfs预处理出每个点到怪兽的最短距离,最后用最短路来跑,具体如何跑详见代码(

总感觉这个最短路有点像dp。。。自己仍处于懵懵懂懂的状态)

顺便说一下,在权值为1时,bfs是可以来跑最短路的

code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

const int MAXN=500+5;
const int MAXM=500*500+5;
using namespace std;
int n,m,w[MAXN][MAXN],cnt;
struct node{
int i,j,pos;
node(){}
node(int a,int b){
i=a;j=b;pos=(i-1)*m+j;
}
}source,target,p[MAXM];
queue<node> Q; bool vis[MAXN][MAXN];
int dd[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
char Map[MAXN][MAXN]; int dis[MAXM];

inline bool inarea(node a){
if(a.i<1||a.j<1||a.i>n||a.j>m) return 0;
else return 1;
}
void bfs(){
while(!Q.empty())
{
node s=Q.front(); Q.pop();
vis[s.i][s.j]=1; node tmp;
for(int i=0;i<4;i++)
{
tmp.i=s.i+dd[i][0];
tmp.j=s.j+dd[i][1];
if(inarea(tmp)&&!vis[tmp.i][tmp.j])
{
Q.push(tmp); vis[tmp.i][tmp.j]=1;
w[tmp.i][tmp.j]=w[s.i][s.j]+1;
}
}
}
return;
}
void spfa(){
while(!Q.empty()) Q.pop();
dis[source.pos]=w[source.i][source.j];
Q.push(source);
while(!Q.empty())
{
node now=Q.front(); Q.pop();
vis[now.i][now.j]=0;
for(int i=0;i<4;i++)
{
int x=now.i+dd[i][0],y=now.j+dd[i][1];
node tmp=node(x,y);
if(!inarea(tmp)) continue;
int cmp=min(dis[now.pos],w[tmp.i][tmp.j]);
if(dis[tmp.pos]<cmp)
{
dis[tmp.pos]=cmp;
if(!vis[tmp.i][tmp.j])
Q.push(tmp),vis[tmp.i][tmp.j]=1;
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",Map[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
switch(Map[i][j])
{
case '+': Q.push(node(i,j));vis[i][j]=1;break;
case 'V': source=node(i,j); break;
case 'J': target=node(i,j); break;
}
}
bfs(); memset(vis,0,sizeof vis);
spfa();
printf("%d",dis[target.pos]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: