#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
const int INF=1000000000;
int n, m, from, to;
int d[510],G[510][510], COST[510][510];
bool visited[510]={false};
vector<int> pre[510];//pre存储的是节点前驱
void Dijkstra(){
fill(d,d+510,INF);
d[from]=0;
for(int i=0;i<n;i++){//n遍循环
int u=-1, minn=INF;
for(int j=0;j<n;j++){
if(d[j]<minn&&!visited[j]){u=j; minn=d[j];}
}
if(u==-1)return ;
visited[u]=true;
for(int j=0;j<n;j++){
if(!visited[j]&&G[u][j]!=INF){
if((d[u]+G[u][j])<d[j]){
d[j]=d[u]+G[u][j];
pre[j].clear();
pre[j].push_back(u);
}
else if((d[u]+G[u][j])==d[j]){
pre[j].push_back(u);
}
}
}
}//n遍循环
}
vector<int> temp, ans;
int value, best_value=INF;
void DFS(int v){
if(v==from){
temp.push_back(v);
value=0;
for(int i=temp.size()-1;i>0;i--){
value+=COST[temp[i]][temp[i-1]];
}
if(value<best_value){best_value=value; ans=temp;}
temp.pop_back();
return ;
}
temp.push_back(v);
for(int i=0;i<pre[v].size();i++){
DFS(pre[v][i]);
}
temp.pop_back();
}
int main(){
int i, c1, c2, dis_temp, cost_temp;
fill(G[0],G[0]+510*510,INF);
fill(COST[0],COST[0]+510*510,INF);
scanf("%d%d%d%d",&n,&m,&from,&to);
for(i=0;i<m;i++){
scanf("%d%d%d%d",&c1,&c2,&dis_temp,&cost_temp);
G[c1][c2]=G[c2][c1]=dis_temp;
COST[c1][c2]=COST[c2][c1]=cost_temp;
}
Dijkstra();
DFS(to);
for(i=ans.size()-1;i>=0;i--)printf("%d ",ans[i]);
printf("%d %d\n",d[to],best_value);
return 0;
}
PAT-A1030
最新推荐文章于 2021-04-24 01:32:59 发布