ダイクストラ+ DSF
簡単な質問セットコード
DSF記憶ポップ
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
const int INF=1000000;
int g[510][510];
int cost[510][510];
int dis[510];
int vis[510];
int n,m,s,d1;//城市数,公路数,起终点
vector<int>pre[510];
void Dijkstra(int x){//s
fill(dis,dis+510,INF);
dis[x]=0;
for(int i=0;i<n;i++){
int u=-1;
int min=INF;
for(int j=0;j<n;j++){
if(dis[j]<min&&vis[j]==0){
u=j;
min=dis[j];
}
}
if(u==-1)return;
vis[u]=1;
for(int v=0;v<n;v++){
if(g[u][v]!=INF&&vis[v]==0){
if(dis[u]+g[u][v]<dis[v]){
dis[v]=dis[u]+g[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(dis[u]+g[u][v]==dis[v]){
pre[v].push_back(u);
}
}
}
}
}
vector<int>temp,path;
int cost1,mincost=INF;
void DSF(int x){//d1
if(x==s){
temp.push_back(x);
cost1=0;
int size=temp.size();
for(int i=0;i<size-1;i++){
cost1=cost1+cost[temp[i]][temp[i+1]];
}
if(cost1<mincost){
path=temp;
mincost=cost1;
}
temp.pop_back();
return;
}
temp.push_back(x);
for(int i=0;i<pre[x].size();i++){
DSF(pre[x][i]);
}
temp.pop_back();
}
int main(){
fill(g[0],g[0]+510*510,INF);
scanf("%d%d%d%d",&n,&m,&s,&d1);
int a,b,c,d;
for(int i=0;i<m;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
g[a][b]=c;
g[b][a]=c;
cost[a][b]=d;
cost[b][a]=d;
}
fill(vis,vis+510,0);
Dijkstra(s);
DSF(d1);
//for(int i=0;i<5;i++)printf("%d ",pre[i].size());
for(int i=path.size()-1;i>=0;i--){
printf("%d ",path[i]);
}
printf("%d %d\n",dis[d1],mincost);
}