#include<stdio.h>
#include<iostream>
using namespace std;
const int maxn=1010;
const int INF=1000000000;
int n,m,c1,c2;
int G[maxn][maxn],d[maxn];
int cost[maxn][maxn],c[maxn];
int vis[maxn];
int pre[maxn];
void dijkstra(int s){
fill(d,d+maxn,INF);
fill(c,c+maxn,0);
for(int i=0;i<maxn;i++){
pre[i]=i;
}
d[s]=0;
c[s]=0;
for(int i=0;i<n;i++){
int u=-1,min=INF;
for(int j=0;j<n;j++){
if(vis[j]==0&&d[j]<min){
u=j;
min=d[j];
}
}
if(u==-1)return;
vis[u]=1;
for(int v=0;v<n;v++){
if(vis[v]==0&&G[u][v]!=INF){
if(d[u]+G[u][v]<d[v]){
d[v]=d[u]+G[u][v];
c[v]=c[u]+cost[u][v];
pre[v]=u;
}
else if(d[u]+G[u][v]==d[v]&&c[v]>c[u]+cost[u][v]){
pre[v]=u;
c[v]=c[u]+cost[u][v];
}
}
}
}
}
void DFS(int s,int v){
if(v==s){
printf("%d ",s);
return;
}
DFS(s,pre[v]);
printf("%d ",v);
}
int main()
{
scanf("%d %d %d %d",&n,&m,&c1,&c2);
int a0,b0,c0,d0;
fill(G[0],G[0]+maxn*maxn,INF); //又忘初始化了
for(int i=0;i<m;i++){
scanf("%d %d %d %d",&a0,&b0,&c0,&d0);
G[a0][b0]=c0;
cost[a0][b0]=d0;
G[b0][a0]=c0;
cost[b0][a0]=d0;
}
dijkstra(c1);
DFS(c1,c2);
printf("%d %d",d[c2],c[c2]);
return 0;
}
原文:https://www.cnblogs.com/1012wenquan66/p/13660377.html