#include "iostream"
using namespace std;
#define Max 500
#define Sky 99999
int Graph[Max][Max],Top,Start,End,Edge;
int Dist[Max],Move[Max],Peo[Max],Sum[Max],Way[Max];
void Dis()
{
int i,j;
for(i=0;i<Top;i++)
{
Dist[i]=Graph[Start][i];
Move[i]=false;
if(i!=Start && Graph[Start][i]!=Sky)
{
Sum[i]=Peo[Start]+Peo[i];
Way[i]=1;
}
}
Dist[Start]=0;
Move[Start]=true;
Sum[Start]=Peo[Start];
Way[Start]=1;
for(i=1;i<=Top-2;i++)
{
int minw,maxp;
minw=maxp=Sky;
int k=Start;
for(j=0;j<Top;j++)
{
if(!Move[j])
{
if(minw>Dist[j])
{
minw=Dist[j];
k=j;
maxp=Sum[j];
}
if(minw==Dist[j] && maxp<Sum[j])
{
maxp=Sum[j];
k=j;
}
}
}
Move[k]=true;
for(j=0;j<Top;j++)
{
if(!Move[j])
{
if(Dist[j]==Dist[k]+Graph[k][j])
{
Way[j]+=Way[k];
if(Sum[j]<Sum[k]+Peo[j])
{
Sum[j]=Sum[k]+Peo[j];
}
}
if(Dist[j]>Dist[k]+Graph[k][j])
{
Dist[j]=Dist[k]+Graph[k][j];
Sum[j]=Sum[k]+Peo[j];
Way[j]=Way[k];
}
}
}
}
}
void Dfs(int end,int Sump)
{
if(end==Start)
{
return;
}
for(int j=0;j<Top;j++)
{
if(Sump-Peo[end]==Sum[j] && Dist[end]-Graph[end][j]==Dist[j])
{
Dfs(j,Sum[j]);
cout<<j<<" ";
}
}
}
int main( )
{
//freopen("1.txt","r",stdin);
cin>>Top>>Edge>>Start>>End;
int i,j;
for(i=0;i<Top;i++)
for(j=0;j<Top;j++)
Graph[i][j]=Sky;
for(i=0;i<Top;i++)
cin>>Peo[i];
for(i=0;i<Edge;i++)
{
int x,y,z;
cin>>x>>y>>z;
Graph[x][y]=Graph[y][x]=z;
}
Dis();
cout<<Way[End]<<" "<<Sum[End]<<endl;
Dfs(End,Sum[End]);
cout<<End<<endl;
return 0;
}
L2-001. 紧急救援-Dijkstra算法的综合运用
原文作者:Dijkstra算法
原文地址: https://blog.csdn.net/dtwd886/article/details/51501876
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/dtwd886/article/details/51501876
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。