#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 505;
int length[maxn][maxn];
int dis[maxn], pre[maxn], vis[maxn], sum[maxn], cost[maxn][maxn];
typedef struct {
int vexnum, edgenum;
int matrix[maxn][maxn];
}Graph;
void Dijkstra(Graph G, int st, int ed){
int mi, n = G.vexnum, id;
for(int i = 0; i < n; i++){
dis[i] = G.matrix[st][i];
vis[i] = 0;
sum[i] = cost[st][i];
}
vis[st] = 1;
for(int i = 1; i < n; i++){
mi = INF, id = -1;
for(int j = 0; j < n; j++){
if(!vis[j]&&dis[j]<mi){
mi = dis[j];
id = j;
}
}
//if(id == ed) break;
vis[id] = 1;
for(int j = 0; j < n; j++){
if(G.matrix[id][j] < INF){
int tmp = dis[id] + G.matrix[id][j];
if(!vis[j]&&tmp<dis[j]){
dis[j] = tmp;
sum[j] = sum[id]+ cost[id][j];
}
else if(!vis[j] && tmp==dis[j]){
if(sum[j] > sum[id] + cost[id][j]){
sum[j] = sum[id]+cost[id][j];
}
}
}
}
}
}
int n,m,s,d;
int main(){
Graph G;
int u, v, l, c;
scanf("%d%d%d%d",&n,&m,&s,&d);
G.vexnum = n, G.edgenum = m;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(i==j) {
G.matrix[i][j] = 0;
cost[i][j] = 0;
}
else {
G.matrix[i][j] = INF;
cost[i][j] = INF;
}
}
}
for(int i = 0; i < m; i++){
scanf("%d%d%d%d",&u,&v,&l,&c);
G.matrix[u][v] = l;
G.matrix[v][u] = l;
cost[u][v] = c;
cost[v][u] = c;
}
Dijkstra(G, s, d);
printf("%d %d\n",dis[d],sum[d]);
return 0;
}
仅供参考 切勿抄袭
hang hang hang !!!