#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define maxn 1005
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
bool book[maxn];
int path[maxn],pathnum[maxn],sumvalue[maxn],dis[maxn],mapp[maxn][maxn];
int n,m,qd,zd,value[maxn];
void dijkstra(int qd)
{
memset(book,false,sizeof(book));
book[qd]=true;
memset(dis,0x3f,sizeof(dis));
dis[qd]=0;
pathnum[qd]=1;
sumvalue[qd]=value[qd];
for(int i=0;i<n;i++)
{
if(mapp[qd][i]!=INF&&i!=qd)
{
dis[i]=mapp[qd][i];
pathnum[i]=1;
sumvalue[i]=sumvalue[qd]+value[qd];
path[i]=qd;
}
}
int tt;
for(int i=1;i<=n-1;i++)
{
int mini=INF;
for(int j=0;j<n;j++)
{
if(book[j]==false&&dis[j]<mini)
{
mini=dis[j];
tt=j;
}
}
book[tt]=true;
for(int u=0;u<n;u++)
{
if(book[u]==false)
{
if(dis[tt]+mapp[tt][u]<dis[u])
{
dis[u]=dis[tt]+mapp[tt][u];
path[u]=tt;
sumvalue[u]=sumvalue[tt]+value[u];
pathnum[u]=pathnum[tt];
}
else if(dis[tt]+mapp[tt][u]==dis[u])
{
pathnum[u]+=pathnum[tt];
if(sumvalue[u]<sumvalue[tt]+value[u])
{
path[u]=tt;
sumvalue[u]=sumvalue[tt]+value[u];
}
}
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>qd>>zd;
for(int i=0;i<n;i++)
cin>>value[i];
memset(mapp,0x3f,sizeof(mapp));
for(int i=0;i<m;i++)
{
int a,b,c;
mapp[a][b]=min(mapp[a][b],c);
mapp[b][a]=mapp[a][b];
}
dijkstra(qd);
int cur=zd;
int bj[maxn];
int cnt=0;
while(cur!=qd)
{
bj[cnt++]=cur;
cur=path[cur];
}
bj[cnt++]=qd;
cout << pathnum[zd] << ' ' << sumvalue[zd] << endl;
for(int i=cnt-1;i>=0;i--)
{
if(i==cnt-1)
cout << bj[i];
else
cout << ' ' << bj[i];
}
cout << endl;
return 0;
}
L2-001紧急救援(最短路,路径,结点值)
猜你喜欢
转载自blog.csdn.net/wwwlps/article/details/79605015
今日推荐
周排行