L2-001紧急救援(最短路,路径,结点值)

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

猜你喜欢

转载自blog.csdn.net/wwwlps/article/details/79605015