天梯地图(30 分)
来源:互联网 发布:淘宝避开同款教程 编辑:程序博客网 时间:2024/05/17 02:24
这个题目,也是最短路,不过路径最短的时候,结点要最小,路径最快的时候,路径最短,所以跑两遍就可以,由于点的个数不多,所以对于两个因素直接用二维数组记录一下就可以。
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <queue>#include <math.h>#include <stack>#include <utility>#include <string>#include <sstream>#include <cstdlib>#include <set>#define LL long longusing namespace std;const int INF = 0x3f3f3f3f;const int maxn = 500 + 10;int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};struct Edge{ int to; int len; int time; Edge(int a = 0,int b = 0,int c = 0) { to = a; len = b; time = c; }};vector<Edge> G[maxn];int dis[maxn][2];int fis[maxn][2];int visD[maxn];int visF[maxn];int ansD[maxn];int ansF[maxn];int preD[maxn];int preF[maxn];int n,m;int st,en;void init(){ memset(ansD,0,sizeof(ansD)); memset(ansF,0,sizeof(ansF));}void spfaD(int s){ memset(dis,INF,sizeof(dis)); memset(visD,0,sizeof(visD)); memset(preD,-1,sizeof(preD)); dis[s][0] = 0; dis[s][1] = 0; visD[s] = 1; preD[s] = -1; queue<int>que; que.push(s); while(!que.empty()) { int v = que.front(); que.pop(); for(int i = 0; i < G[v].size(); i++) { Edge e = G[v][i]; int u = e.to; int cost = e.len; if(dis[u][0] > dis[v][0] + cost || (dis[u][0] == dis[v][0] + cost && dis[u][1] > dis[v][1] + 1)) { dis[u][0] = dis[v][0] + cost; dis[u][1] = dis[v][1] + 1; preD[u] = v; if(!visD[u]) { visD[u] = 1; que.push(u); } } } visD[v] = 0; }}void spfaF(int s){ memset(visF,0,sizeof(visF)); memset(preF,-1,sizeof(preF)); memset(fis,INF,sizeof(fis)); fis[s][0] = fis[s][1] = 0; visF[s] = 1; preF[s] = -1; queue<int> que1; que1.push(s); while(!que1.empty()) { int v = que1.front(); que1.pop(); for(int i = 0; i < G[v].size(); i++) { Edge e1 = G[v][i]; int u = e1.to; if(fis[u][0] > fis[v][0] + e1.time || (fis[u][0] == fis[v][0]+e1.time) && (fis[u][1] > fis[v][1] + e1.len)) { fis[u][0] = fis[v][0] + e1.time; preF[u] = v; fis[u][1] = fis[v][1] + e1.len; if(!visF[u]) { visF[u] = 1; que1.push(u); } } } visF[v] = 0; }}int main(){ scanf("%d %d",&n,&m); init(); for(int i = 0; i < m; i++) { int x,y,w,d,flag; scanf("%d %d %d %d %d",&x,&y,&flag,&d,&w); if(flag) { G[x].push_back(Edge(y,d,w)); } else { G[x].push_back(Edge(y,d,w)); G[y].push_back(Edge(x,d,w)); } } scanf("%d %d",&st,&en); spfaF(st); spfaD(st); ansD[0] = ansF[0] = 0; int cnt1,cnt2; cnt1 = cnt2 = 0; int t = en; while(t != -1) { ansD[++cnt1] = t; t = preD[t]; } t = en; while(t != -1) { ansF[++cnt2] = t; t = preF[t]; } int flag = 0; if(cnt1 != cnt2) { flag = 1; } else { for(int i = 1; i <= cnt1; i++) { if(ansD[i] != ansF[i]) { flag = 1; break; } } } if(!flag) { printf("Time = %d; Distance = %d: ",fis[en][0],dis[en][0]);//Time = 3; Distance = 4: 3 => 2 => 5 for(int i = cnt1; i >= 1; i--) { if(i == 1) printf("%d",ansD[i]); else { printf("%d => ",ansD[i]); } } } else { printf("Time = %d: ",fis[en][0]);//Time = 6: 5 => 4 => 8 => 3 for(int i = cnt2; i >= 1; i--) { if(i == 1) printf("%d",ansF[i]); else { printf("%d => ",ansF[i]); } } puts(""); printf("Distance = %d: ",dis[en][0]); for(int i = cnt1; i >= 1; i--) { if(i == 1) printf("%d",ansD[i]); else { printf("%d => ",ansD[i]); } } } return 0;}
阅读全文
1 0
- 天梯地图(30 分)
- 天梯地图(30 分)
- 7-14 天梯地图(30 分)
- 天梯赛练习 天梯地图(SPFA)
- 天梯地图(Dijkstra变形)
- pta 天梯地图 (Dijkstra)
- L3-007. 天梯地图
- PTA 一 天梯地图
- PTA天梯地图
- 5-11 天梯地图
- L3-007. 天梯地图
- PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)
- 团体程序设计天梯赛 L3-007. 天梯地图(dijkstral+记录所有最短路径)
- patest L3-007 天梯地图
- PAT【L3-007】 天梯地图
- Floyd算法-天梯地图.cpp
- L3-007. 天梯地图-PAT团体程序设计天梯赛GPLT
- 团体程序设计天梯赛L3-007 天梯地图
- app model下 build.gradle 修改一下就卡的不行解决办法
- 输出符合条件的指定行
- PAT
- 共轭方向法和共轭梯度法
- api文档的安装
- 天梯地图(30 分)
- Redis实现原理:数据同步机制分析
- dialog.show()异常
- 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。
- libxxx.so- text relocations问题的终极解决方案
- 吉信通短信接口(HTTP协议) java
- EasyUI DataGrid 鼠标悬停提示
- Kreas 训练自己的图像数据处理回归问题
- 文章标题