分析:单纯的DFS,记录路径,最短dis和最小cost
#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#define MAX 99999999
using namespace std;
typedef long long ll;
int n,m;
int road[501][501];
int dis[501][501];
int cost[501][501];
int visi[501];
int s,d;
int min_cos = MAX;
int c_cos;
int min_dis = MAX;
int c_dis;
vector<int>ans;
vector<int>c_ans;
void dfs(int root)
{
visi[root] = 1;
if(root == d){
if(c_dis < min_dis){
min_dis = c_dis;
min_cos = c_cos;
ans = c_ans;
}
else if(c_dis == min_dis && c_cos < min_cos){
min_cos = c_cos;
ans = c_ans;
}
}
else{
for(int i = 0;i<n;i++)
if(!visi[i] && road[root][i]){
c_dis += dis[root][i];
c_cos += cost[root][i];
c_ans.push_back(i);
dfs(i);
c_dis -= dis[root][i];
c_cos -= cost[root][i];
c_ans.pop_back();
}
}
visi[root] = 0;
}
int main()
{
cin>>n>>m>>s>>d;
for(int i = 0;i<m;i++)
{
int a,b,x,y;
cin>>a>>b>>x>>y;
road[a][b] = road[b][a] = 1;
dis[a][b] = dis[b][a] = x;
cost[a][b] = cost[b][a] = y;
}
dfs(s);
cout<<s;
for(int i = 0;i<ans.size();i++)
cout<<" "<<ans[i];
cout<<" "<<min_dis<<" "<<min_cos;
return 0;
}