#include <iostream>
#include <cstring>
using
namespace
std;
const
int
N = 1001;
const
int
MAX = 1 << 30;
int
dm[N][N];
int
pm[N][N];
int
minDis, minCost;
void
dijkstra(
int
s,
int
t,
int
n);
int
main(){
int
n, m;
while
(cin >> n >> m){
if
(n==0 && m==0)
break
;
for
(
int
i=1; i<=n; i++){
for
(
int
j=1; j<=n; j++){
dm[i][j] = MAX;
pm[i][j] = MAX;
}
}
for
(
int
i=0; i<m; i++){
int
a, b, d, p;
cin >> a >> b >> d >> p;
if
(dm[a][b] > d){
dm[a][b] = dm[b][a] = d;
pm[a][b] = pm[b][a] = p;
}
else
if
(dm[a][b]==d && pm[a][b]>p){
pm[a][b] = pm[b][a] = p;
}
}
int
s, t;
cin >> s >> t;
dijkstra(s, t, n);
cout << minDis <<
' '
<< minCost << endl;
}
return
0;
}
void
dijkstra(
int
s,
int
t,
int
n){
int
dis[N];
int
cost[N];
for
(
int
i=1; i<=n; i++){
dis[i] = MAX;
cost[i] = MAX;
}
bool
visit[N];
memset
(visit,
false
,
sizeof
(visit));
dis[s] = 0;
cost[s] = 0;
for
(
int
i=0; i<n; i++){
int
min = MAX;
int
k;
for
(
int
j=1; j<=n; j++){
if
(!visit[j] && dis[j]<min){
min = dis[j];
k = j;
}
}
visit[k] =
true
;
for
(
int
j=1; j<=n; j++){
if
(!visit[j] && dis[j]>min+dm[k][j]){
dis[j] = min + dm[k][j];
cost[j] = cost[k] + pm[k][j];
}
else
if
(!visit[j] && dis[j]==min+dm[k][j] && cost[j]>cost[k]+pm[k][j]){
cost[j] = cost[k] + pm[k][j];
}
}
}
minDis = dis[t];
minCost = cost[t];
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步