#include<iostream>
using namespace std;
#define MAX 99999
int fee[500][500];
int len[500][500];
void floydlen(int n) {
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
if(len[i][k]+len[k][j]<len[i][j]){
//更新路径
len[i][j]=len[i][k]+len[k][j];
len[j][i]=len[i][j];
fee[i][j]=fee[i][k]+fee[k][j];
fee[j][i]=fee[i][j];
}
//最短路径相等 才去比较路费
else if (len[i][k] + len[k][j] == len[i][j]) {
fee[i][j]=min(fee[i][j],fee[i][k]+fee[k][j]);
}
}
}
}
}
int main(){
//其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。
int N,M,S,D;
cin>>N>>M>>S>>D;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(i==j){fee[i][j]=0;len[i][j]=0;continue;} //可加可不加
fee[i][j]=MAX;
len[i][j]=MAX;
}
}
while(M--){
int c1,c2,loadlen,loadfee;
cin>>c1>>c2>>loadlen>>loadfee;
len[c1][c2]=loadlen;
len[c2][c1]=loadlen;
fee[c1][c2]=loadfee;
fee[c2][c1]=loadfee;
}
floydlen(N);
cout<<len[S][D]<<' '<<fee[S][D]<<endl;
return 0;
}
05-19
1571