传送门:简单的图论问题?
中文题目不做过多的解释
解题思路
输出的第一个就是使用简单dijsktra就可以了,对于有趣的情况使用优先队列+BFS就可以,这两种情况分别处理
AC代码
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
const int MAXN = 505;
const int INF = 0x3f3f3f3f;
int dirX[4] = {0,0,1,-1};
int dirY[4] = {1,-1,0,0};
int m[MAXN][MAXN],M,N;
int dis[MAXN][MAXN];
bool vis[MAXN][MAXN][4];
struct Node{
int x,y,step,w;
int state[200];
};
void init()
{
memset(dis,INF,sizeof dis);
}
struct QNode{
int pre,x,y,dist;
friend bool operator <(QNode a,QNode b)
{
return a.dist>b.dist;
}
};
void BFS(int sX,int sY,int eX,int eY)
{
if(sX==eX&&sY==eY){
puts("0");
return ;
}
memset(vis,false,sizeof vis);
priority_queue<QNode>Q;
QNode cur;
QNode nxt;
cur.x = sX;cur.y = sY;cur.dist = m[sX][sY];
for(int i=0;i<4;i++)
{
nxt.x = cur.x+dirX[i];
nxt.y = cur.y+dirY[i];
nxt.pre = i;
if(nxt.x<1||nxt.x>N||nxt.y>M||nxt.y<1||vis[nxt.x][nxt.y][nxt.pre]||m[nxt.x][nxt.y]==-1) continue;
nxt.dist = cur.dist + m[nxt.x][nxt.y];
if(nxt.x==eX&&nxt.y==eY){
printf("%d\n",nxt.dist);
return ;
}
vis[nxt.x][nxt.y][nxt.pre] = true;
Q.push(nxt);
}
while(!Q.empty())
{
cur = Q.top();Q.pop();
for(int i=0;i<4;i++)
{
if(i==cur.pre)continue;
nxt.x = cur.x+dirX[i];
nxt.y = cur.y+dirY[i];
nxt.pre = i;
if(nxt.x<1||nxt.x>N||nxt.y>M||nxt.y<1||vis[nxt.x][nxt.y][nxt.pre]||m[nxt.x][nxt.y]==-1) continue;
//if(!jud(nxt,2))continue;
nxt.dist = cur.dist + m[nxt.x][nxt.y];
if(nxt.x==eX&&nxt.y==eY){
printf("%d\n",nxt.dist);
return ;
}
vis[nxt.x][nxt.y][nxt.pre] = true;
Q.push(nxt);
}
}
puts("-1");
}
void dijkstra(int sX,int sY,int eX,int eY)
{
if(sX==eX&&sY==eY){
puts("0");
return ;
}
queue<Node>Q;
memset(dis,INF,sizeof dis);
dis[sX][sY] = m[sX][sY];
Node cur;
Node nxt;
cur.x = sX,cur.y = sY;
Q.push(cur);
while(!Q.empty())
{
cur = Q.front();Q.pop();
for(int i=0;i<4;i++)
{
int tmpX = cur.x+dirX[i];
int tmpY = cur.y+dirY[i];
if(tmpX<1||tmpX>N||tmpY<1||tmpY>M||m[tmpX][tmpY]==-1) continue;
if(dis[cur.x][cur.y]+m[tmpX][tmpY]<dis[tmpX][tmpY]){
dis[tmpX][tmpY] = dis[cur.x][cur.y]+m[tmpX][tmpY];
nxt = cur;
nxt.x = tmpX,nxt.y = tmpY;
Q.push(nxt);
}
}
}
printf("%d ",dis[eX][eY]==INF?-1:dis[eX][eY]);
}
int toInt(char *ch)
{
int len = strlen(ch);
//110
int ret = 0;
for(int i=0;i<len;i++){
ret+=(ch[i]-'0')*pow(10,len-1-i);
}
return ret;
}
int main()
{
char ch[5];
int x1,x2,y1,y2;
int cnt =1;
while(~scanf("%d%d%d%d%d%d",&N,&M,&x1,&y1,&x2,&y2))
{
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++){
scanf("%s",ch);
if(ch[0] == '*') m[i][j] = -1;
else m[i][j] = toInt(ch);
}
printf("Case %d: ",cnt++);
dijkstra(x1,y1,x2,y2);
BFS(x1,y1,x2,y2);
}
return 0;
}