#include<bits/stdc++.h>
using namespace std;
const int MAXN=510;
const int INF=100000;
int n,m,s,ed;
int G[MAXN][MAXN],cost[MAXN][MAXN];
int d[MAXN],c[MAXN],pre[MAXN];
bool vis[MAXN]={false};
void dijkstra(int p){
fill(d,d+MAXN,INF);
fill(c,c+MAXN,INF);
for(int i=0;i<n;i++)
pre[i]=i;
d[p]=0;
c[p]=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){
min=d[j];
u=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]&&c[u]+cost[u][v]<c[v]){
c[v]=c[u]+cost[u][v];
pre[v]=u;
}
}
}
}
}
void dfs(int v){
if(v==s){
cout<<s;
return;
}
dfs(pre[v]);
cout<<" "<<v;
}
int main(){
cin>>n>>m>>s>>ed;
int u,v;
fill(G[0],G[0]+MAXN*MAXN,INF);
for(int i=0;i<m;i++){
cin>>u>>v;
cin>>G[u][v]>>cost[u][v];
G[v][u]=G[u][v];
cost[v][u]=cost[u][v];
}
dijkstra(s);
dfs(ed);
cout<<" "<<d[ed]<<" "<<c[ed]<<endl;
return 0;
}
07-18
07-18
07-18
07-18
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交