第六章 图论 5 AcWing 1601. 在线地图
原题链接
算法标签
图论 单源最短路 dijkstra
思路
依题意模拟 具体思路见代码
代码
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define ump unordered_map
#define pq priority_queue
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>=b;--i)
using namespace std;
typedef pair<int, int> PII;
const int N = 205;
vector<int> path;
int n, m, S, T;
// d1[i][j] 存储i, j路口之间街道长度 d2[i][j]存储i, j路口之间街道花费的时间 dist1[i] 存储到达i路口最短街道长度 dist2[i] 存储到达i路口最短花费的时间 pre[i] 路口i的前驱节点
int d1[N][N], d2[N][N], dist1[N], dist2[N], pre[N];
bool st[N];
inline int rd(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
// 返回最短距离 路线
pair<int, string> dij(int d1[][N], int d2[][N], int type){
memset(dist1, 0x3f, sizeof dist1);
memset(dist2, 0x3f, sizeof dist2);
memset(st, 0, sizeof st);
dist1[S]=dist2[S]=0;
rep(i, 0, n){
int t=-1;
rep(j, 0, n){
if(!st[j]&&(t==-1||dist1[t]>dist1[j])){
t=j;
}
}
st[t]=true;
rep(j, 0, n){
int w;
// 如果最短路线不唯一,则输出用时最短的那条路线(保证唯一)。即第二关键字为时间
if(type==0){
w=d2[t][j];
}else{ // 如果最快路线不唯一,则输出经过路口最少的那条路线(保证唯一)。即第二关键字为节点数
w=1;
}
if(dist1[j]>dist1[t]+d1[t][j]){
dist1[j]=dist1[t]+d1[t][j];
dist2[j]=dist2[t]+w;
pre[j]=t;
}else if(dist1[j]=dist1[t]+d1[t][j]){
if(dist2[j]>dist2[t]+w){
dist2[j]=dist2[t]+w;
pre[j]=t;
}
}
}
}
for(int i=T; i!=S; i=pre[i]){
path.push_back(i);
}
pair<int, string> res;
res.x=dist1[T];
res.y=to_string(S);
Rep(i, path.size()-1, 0){
res.y+=" -> "+to_string(path[i]);
}
return res;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
n=rd(), m=rd();
int v1, v2, ow, l, t;
memset(d1, 0x3f, sizeof d1);
memset(d2, 0x3f, sizeof d2);
while(m--){
v1=rd(), v2=rd(), ow=rd(), l=rd(), t=rd();
d1[v1][v2]=min(d1[v1][v2], l);
d2[v1][v2]=min(d2[v1][v2], t);
if(!ow){
d1[v2][v1]=min(d1[v2][v1], l);
d2[v2][v1]=min(d2[v2][v1], t);
}
}
S=rd(), T=rd();
auto A=dij(d1, d2, 0);
auto B=dij(d2, d1, 1);
if(A.y!=B.y){
printf("Distance = %lld: %s\n", A.x, A.y.c_str());
printf("Time = %lld: %s\n", B.x, B.y.c_str());
}else{
printf("Distance = %lld; Time = %s", A.x, B.x, A.y.c_str());
}
return 0;
}
参考文献
AcWing 1601. 在线地图(PAT甲级辅导课)y总视频讲解
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈