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
- BNU 1642 简单的图论问题? 最短路+BFS
- NBUT OJ 1642 简单的图论问题? 最短路问题,BFS
- UVA 1599 Ideal Path【双向bfs+非简单图的最短路】
- POJ 1724 ROADS 有约束的最短路问题, BFS
- 迷宫的最短路问题(水+BFS宽搜)
- 图论的最短路问题
- 迷宫问题、最短路(BFS,DFS)
- hdu5876 Sparse Graph -补图的最短路-bfs
- poj1847~简单最短路问题
- BNU 26480 Horror List【最短路】
- NOJ 题目1642 简单的图论问题?(BFS)
- bfs最短路
- hdu1548 最短路/BFS
- BFS最短路路径
- hdu2433 BFS最短路
- jzoj 2051. 【8.18】极其简单的最短路问题
- 9.9 极其简单的最短路问题 2721
- SSL P2721 极其简单的最短路问题
- Maven学习总结(八)——使用Maven构建多模块项目
- Java基础之-压缩与解压
- 反射类的普通方法
- Codeforces596C. Wilbur and Points
- java中线程池的几种实现方式
- BNU 1642 简单的图论问题? 最短路+BFS
- 【PHP】函数explode和split的区别
- 一道C语言笔试题解析,检查源代码中的错误
- 反射类的属性
- Java方法的学习
- mvp(二)
- 使用moveTaskToback()让APP退到后台
- javaee之java基础加强
- HDU 2181 哈密顿绕行世界问题(搜索)