link
int G[N][N],cost[N][N];
fill(G[0],G[0]+N*N,INF);
for(int i=0;i<m;i++){
int u,v,tmp_w,tmp_c;
cin>>u>>v>>tmp_w>>tmp_c;
G[u][v]=G[v][u]=tmp_w;
cost[u][v]=cost[v][u]=tmp_c;
}
Dijkstra(s);
int d[N],c[N];
fill(d,d+N,INF);
memset(c,0,sizeof(c));
d[s]=0;
c[s]=0;
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;
}
}
}
}
}
}
for(int i=0;i<n;i++){
int MIN=INF,u=-1;
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;
dfs(e);
void dfs(int v){
if(v==s){
cout<<v<<" ";
return;
}
dfs(pre[v]);
cout<<v<<" ";
}
cout<<d[e]<<" "<<c[e];
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1010;
const int INF=1000000000;
int n,m,s,e;
int G[N][N],cost[N][N];
int d[N],c[N],pre[N];
bool vis[N]={false};
void dfs(int v){
if(v==s){
cout<<v<<" ";
return;
}
dfs(pre[v]);
cout<<v<<" ";
}
void Dijkstra(int s){
fill(d,d+N,INF);
memset(c,0,sizeof(c));
d[s]=0;
c[s]=0;
for(int i=0;i<n;i++){
int MIN=INF,u=-1;
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]){
if(c[u]+cost[u][v]<c[v]){
c[v]=c[u]+cost[u][v];
pre[v]=u;
}
}
}
}
}
}
int main()
{
cin>>n>>m>>s>>e;
fill(G[0],G[0]+N*N,INF);
for(int i=0;i<m;i++){
int u,v,tmp_w,tmp_c;
cin>>u>>v>>tmp_w>>tmp_c;
G[u][v]=G[v][u]=tmp_w;
cost[u][v]=cost[v][u]=tmp_c;
}
Dijkstra(s);
dfs(e);
cout<<d[e]<<" "<<c[e];
return 0;
}
#include <iostream>
using namespace std;
#include <iostream>
using namespace std;
const int N = 1000;
const int INF = 1000000000;
int n, m, s, e;
int G[N][N],cost[N][N];
int d[N],c[N],pre[N];
bool vis[N] = { false };
void Dijkstra(int s) {
fill(d, d + N, INF);
fill(c, c + N, 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 == s) {
cout << v<<" ";
return;
}
dfs(pre[v]);
cout << v << " ";
}
int main() {
cin >> n >> m >> s >> e;
fill(G[0], G[0] + N * N, INF);
for (int i = 0; i < m; i++) {
int u, v, tmp_w, tmp_cost;
cin >> u >> v >> tmp_w >> tmp_cost;
G[u][v] = G[v][u] = tmp_w;
cost[u][v] = cost[v][u] = tmp_cost;
}
Dijkstra(s);
dfs(e);
cout << d[e] << " " << c[e];
return 0;
}