L2-001. 紧急救援-Dijkstra算法的综合运用

#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;
}

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/dtwd886/article/details/51501876
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞