AcWing 1507. 旅行计划
原题链接
中等
作者:
leo123456
,
2020-08-25 21:37:02
,
所有人可见
,
阅读 1023
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=510;
int n,m,S,T;
int d[N][N],s[N][N],cost[N];
int dist[N],pre[N];
bool st[N];
void dijkstra()
{
memset(dist,0x3f,sizeof dist); //初始化不能忘记
memset(cost,0x3f,sizeof cost);
dist[S]=0,cost[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[t]>dist[j]))
t=j;
st[t]=true;
for(int j=0;j<n;j++)
if(dist[j]>dist[t]+d[t][j])
{
dist[j]=dist[t]+d[t][j];
cost[j]=cost[t]+s[t][j];
pre[j]=t;
}
else if(dist[j]==dist[t]+d[t][j])
{
if(cost[j]>cost[t]+s[t][j])
{
dist[j]=dist[t]+d[t][j];
cost[j]=cost[t]+s[t][j];
pre[j]=t;
}
}
}
}
int main()
{
memset(d,0x3f,sizeof d);//初始化不能忘记
memset(s,0x3f,sizeof s);
cin>>n>>m>>S>>T;
while(m--)
{
int a,b,x,y;
cin>>a>>b>>x>>y;
d[a][b]=d[b][a]=min(d[a][b],x);
s[a][b]=s[b][a]=min(s[a][b],y);
}
dijkstra();
vector<int> path;
for(int i=T;i!=S;i=pre[i]) path.push_back(i);
cout<<S;
for(int i=path.size()-1;i>=0;i--) cout<<' '<<path[i];
cout<<' '<<dist[T]<<' '<<cost[T]<<endl;
return 0;
}