1030 Travel Plan (30 分) 难度: 中 / 知识点: 最短路
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1030 Travel Plan (30 分) 难度: 中 / 知识点: 最短路相关的知识,希望对你有一定的参考价值。
https://pintia.cn/problem-sets/994805342720868352/problems/994805464397627392
先跑一下Dijkstra()
然后再dfs()一下求最短路下的最小花费即可,记得保存路径。
#include<bits/stdc++.h>
using namespace std;
const int N=1e2*5+10;
const int inf=0x3f3f3f3f;
int dist[N],g[N][N],price[N][N],n,m,s,d;
int st[N],ans=inf;
vector<int>paths,temp;
void Dijkstra()
{
memset(dist,0x3f,sizeof dist);
dist[s]=0;
for(int i=0;i<n;i++)
{
int t=-1;
for(int j=0;j<n;j++) if(!st[j]&&(t==-1 || dist[j]<dist[t])) t=j;
st[t]=1;
for(int j=0;j<n;j++) dist[j]=min(dist[j],dist[t]+g[t][j]);
}
}
void dfs(int u,int father,int sum)
{
if(u==d)
{
if(sum<ans)
{
ans=sum,paths=temp;
paths.push_back(d);
}
return;
}
for(int i=0;i<n;i++)
{
if(i==father) continue;//避免走回路
if(dist[i]==dist[u]+g[u][i])//是最短路上的点
{
temp.push_back(u);
dfs(i,u,sum+price[u][i]);
temp.pop_back();
}
}
}
int main(void)
{
cin>>n>>m>>s>>d;
memset(g,0x3f,sizeof g);
memset(price,0x3f,sizeof price);
for(int i=0;i<m;i++)
{
int a,b,c,w; cin>>a>>b>>c>>w;
if(g[a][b]>c)
{
g[a][b]=g[b][a]=c;
price[a][b]=price[b][a]=w;
}
}
Dijkstra();
dfs(s,-1,0);
for(int i=0;i<paths.size();i++) cout<<paths[i]<<" ";
cout<<dist[d]<<" "<<ans;
return 0;
}
以上是关于1030 Travel Plan (30 分) 难度: 中 / 知识点: 最短路的主要内容,如果未能解决你的问题,请参考以下文章