BNU 1642 简单的图论问题? 最短路+BFS

来源:互联网 发布:js中树形菜单制作方法 编辑:程序博客网 时间:2024/05/16 15:20

传送门:简单的图论问题?
中文题目不做过多的解释

解题思路

输出的第一个就是使用简单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;}
0 1
原创粉丝点击