题目地址
1.dijkstra
2.边权维护
3.简单路径记录
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int grape[505][505];//存两点的距离
int cost[505][505];//存过路的价钱
int mon[505];
int dis[505];
bool vis[505];
vector<int > pre[505];
vector<int > rd;
int n,m,start,endss;
//存路径
void p(int s)
{
rd.push_back(s);
if(s==start){
return;
}
p(pre[s][0]);
}
int main()
{
fill(grape[0],grape[0]+505*505,inf);
fill(dis,dis+505,inf);
scanf("%d%d%d%d",&n,&m,&start,&endss);
for(int i=0;i<m;i++){
int u,v,l_road,c_road;
scanf("%d%d%d%d",&u,&v,&l_road,&c_road);
grape[u][v] = l_road;
grape[v][u] = l_road;
cost[u][v] = c_road;
cost[v][u] = c_road;
}
dis[start] = 0;
for(int i=0;i<n;i++){
int u=-1,minss = inf;
for(int j=0;j<n;j++){
if(vis[j]==false&&dis[j]<minss){
u = j;
minss = dis[j];
}
}
if(u==-1) break;
vis[u] = true;
for(int v=0;v<n;v++){
if(vis[v]==false&&grape[u][v]!=inf)
{
if(dis[v] > dis[u] + grape[u][v]){
dis[v] = dis[u] + grape[u][v];
mon[v] = mon[u] + cost[u][v];
pre[v].clear();
pre[v].push_back(u);
}
else if(dis[v]==dis[u] + grape[u][v]){
if(mon[v]>mon[u] + cost[u][v]){
mon[v] = mon[u] + cost[u][v];
pre[v].clear();
pre[v].push_back(u);
}
}
}
}
}
p(endss);
for(int i=rd.size()-1;i>=0;i--){
cout<<rd[i]<<" ";
}
cout<<dis[endss]<<" "<<mon[endss];
return 0;
}