POJ 3268

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
using namespace std;

const int maxn=1005;
const int inf = 0x3f3f3f3f;
int mapp[maxn][maxn];
int dis[maxn],diss[maxn];
int vis[maxn],viss[maxn];
int sum[maxn];
int a,b,c,n,m,x;
int minx;


void dijkstra1(int x)
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=mapp[x][i];
	}
	
	for(int i=0;i<n;i++)
	{
		int k=0;
		int minx=inf;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&minx>dis[j])
			{
				minx=dis[j];
				k=j;
			}
		}
		vis[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&dis[j]>dis[k]+mapp[k][j])
			{
				dis[j]=dis[k]+mapp[k][j];
			}
		}
	}
}

void dijkstra2(int x)
{
	for(int i=1;i<=n;i++)
	{
		diss[i]=mapp[i][x];
	}
	
	for(int i=0;i<n;i++)
	{
		int k=0;
		int minx=inf;
		for(int j=1;j<=n;j++)
		{
			if(!viss[j]&&minx>diss[j])
			{
				minx=diss[j];
				k=j;
			}
		}
		viss[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(!viss[j]&&diss[j]>diss[k]+mapp[j][k])
			{
				diss[j]=diss[k]+mapp[j][k];
			}
		}
	}
}
int main()
{
	scanf("%d %d %d",&n,&m,&x);
	memset(mapp,inf,sizeof(mapp));
	memset(vis,0,sizeof(vis));
	memset(dis,0,sizeof(dis));
	memset(diss,0,sizeof(diss));
	memset(viss,0,sizeof(viss));
	memset(sum,0,sizeof(sum));
	for(int i=0;i<m;i++)
	{
		scanf("%d %d %d",&a,&b,&c);
		mapp[a][b]=c;
	}
	dijkstra1(x);
	dijkstra2(x);

	for(int i=1;i<=n;i++)
	{	
		if(x==i)
			continue;
		sum[i]=dis[i]+diss[i];
	}
	sort(sum+1,sum+n+1);
	printf("%d\n",sum[n]);
	return 0;
}
posted @ 2020-10-07 19:59  天明天明  阅读(68)  评论(0编辑  收藏  举报