输入
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
输出
0 2 3 3 40
程序
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
//最大顶点数
const int MAXV=510;
const int INF=0x3fffffff;
//n为顶点数,m为边数,st和ed分别为起点和终点
//G为距离矩阵,cost为花费矩阵
//d[]记录最短距离,c[]记录最小花费
int n,m,st,ed,G[MAXV][MAXV],cost[MAXV][MAXV];
int d[MAXV],c[MAXV],pre[MAXV];
bool vis[MAXV]={false};
//S为起点
void Dijkstra(int s)
{
fill(d,d+MAXV,INF);
fill(c,c+MAXV,INF);
for(int i=0;i<n;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]==false && d[j]<MIN )
{
u=j;
MIN=d[j];
}
}
if(u==-1)
{
return;
}
vis[u]=true;
for(int v=0;v<n;v++)
{
if( vis[v]==false && 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] )
{
if( c[u]+cost[u][v]<c[v] )
{
c[v]=c[u]+cost[u][v];
pre[v]=u;
}
}
}
}
}
}
//打印路径
void DFS(int v)
{
if(v==st)
{
printf("%d",v);
return;
}
DFS(pre[v]);
printf(" %d",v);
}
int main()
{
scanf("%d%d%d%d",&n,&m,&st,&ed);
int u,v;
//初始化图G
fill(G[0],G[0]+MAXV*MAXV,INF);
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
scanf("%d%d",&G[u][v],&cost[u][v]);
G[v][u]=G[u][v];
cost[v][u]=cost[u][v];
}
//迪杰斯特拉算法入口
Dijkstra(st);
//打印路径
DFS(ed);
//最短距离、最短路径下的最小花费
printf(" %d %d\n",d[ed],c[ed]);
return 0;
}