PAT 甲级 1030 Travel Plan
简单写一个BellmanFord+DFS
#include <bits/stdc++.h>
using namespace std;
int n,m,s,d;
const int MAXN=510;
const int INF=0x3f3f3f3f;
unordered_map<int,int> dis_graph[MAXN];
unordered_map<int,int> cost_graph[MAXN];
set<int> pre[MAXN];
int min_dis[MAXN];
void BellmanFord()
{
memset(min_dis,INF,sizeof(min_dis));
min_dis[s]=0;
for(int itr=0;itr<n-1;++itr){
//for all edges
for(int i=0;i<n;++i){
for(auto edge:dis_graph[i]){
int u=i,v=edge.first,dis=edge.second;
if(min_dis[v]>=min_dis[u]+dis){
if(min_dis[v]!=min_dis[u]+dis)
pre[v].clear();
pre[v].insert(u);
min_dis[v]=min_dis[u]+dis;
}
}
}
}
}
vector<int> re_ans_path,re_path;
int ans_cost=INF;
void DFS(int now,int cost_now)
{
if(now==s&&cost_now<ans_cost){
ans_cost=cost_now;
re_ans_path=re_path;
return;
}
for(auto to:pre[now]){
re_path.push_back(to);
DFS(to,cost_now+cost_graph[now][to]);
re_path.pop_back();
}
}
int main() {
cin>>n>>m>>s>>d;
int x,y,z,c;
for(int i=0;i<m;++i){
cin>>x>>y>>z>>c;
dis_graph[x][y]=dis_graph[y][x]=z;
cost_graph[x][y]=cost_graph[y][x]=c;
}
BellmanFord();
re_path.push_back(d);
DFS(d,0);
for(int i=re_ans_path.size()-1;i>=0;--i){
cout<<re_ans_path[i]<<" ";
}
cout<<min_dis[d]<<" "<<ans_cost;
}