Note
Code
#include<bits/stdc++.h>
using namespace std;
int n,m,s,d,min_cost=1e9,totaldist;
int dis[510];
const int INF=1e9;
struct Node{
int dist,cost;
Node(int d,int c){
dist=d;
cost=c;
}
Node(){}
}adj[510][510];
vector<int> temp,ans,pre[510];
bool visit[510]={false};
void dijkstra(int now){
fill(dis,dis+510,INF);
dis[now]=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(visit[j]==false&&dis[j]<MIN){
u=j;
MIN=dis[j];
}
}
if(u==-1) return ;
visit[u]=true;
for(int j=0;j<510;j++){
if(visit[j]==false&&adj[u][j].dist>-1){
if(dis[u]+adj[u][j].dist<dis[j]){
dis[j]=dis[u]+adj[u][j].dist;
pre[j].clear();
pre[j].push_back(u);
}
else if(dis[u]+adj[u][j].dist==dis[j]){
pre[j].push_back(u);
}
}
}
}
}
void dfs(int begins,int ends){
if(begins==ends){
temp.push_back(begins);
int costs=0,dis=0;
for(int i=temp.size()-1;i>0;i--){
int first=temp[i],second=temp[i-1];
costs+=adj[first][second].cost;
dis+=adj[first][second].dist;
}
if(costs<min_cost){
min_cost=costs;
ans=temp;
totaldist=dis;
}
temp.pop_back();
return ;
}
temp.push_back(ends);
for(int i=0;i<pre[ends].size();i++){
dfs(begins,pre[ends][i]);
}
temp.pop_back();
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
for(int i=0;i<510;i++)
for(int j=0;j<510;j++)
adj[i][j]=Node(-1,-1);
int cc1,cc2,distance,cos;
scanf("%d %d %d %d",&n,&m,&s,&d);
for(int i=0;i<m;i++){
scanf("%d %d %d %d",&cc1,&cc2,&distance,&cos);
adj[cc1][cc2]=Node(distance,cos);
adj[cc2][cc1]=Node(distance,cos);
}
dijkstra(s);
dfs(s,d);
for(int i=ans.size()-1;i>=0;i--){
printf("%d ",ans[i]);
}
printf("%d %d",totaldist,min_cost);
return 0;
}