USACO 2009 Jan Silver 1.Best Spot 最短路 FLOYD/SPFA

洛谷:https://www.luogu.com.cn/problem/P2935

一道最短路水题。

以每个点为起点跑一遍SPFA,之后累加F点的dis值

代码如下:

#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
#define P 500
#define C 16001
int num[P];
int head[P],v[C],to[C],nxt[C];
int dis[P];
bool inQ[P];
int ans[P];
queue<int>q;
int tot=0;
int min(int x,int y)
{
	return x<y?x:y;
}
void spfa(int s)
{
	memset(dis,0x3f3f,sizeof(dis));
	dis[s]=0;
	q.push(s);
	inQ[s]=1;
	while(!q.empty())
	{
		int p=q.front();
		q.pop();
		inQ[p]=0;
		for(int i=head[p];i;i=nxt[i])
		{
			int y=to[i];
			if(dis[y]>dis[p]+v[i])
			{
				dis[y]=dis[p]+v[i];
				if(inQ[y]==0)
				q.push(y),inQ[y]=1;
			}
		}
	}
}
void add(int x,int y,int z)
{
	v[++tot]=z;
	to[tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;	
}
int main()
{
	int n,f,m;
	scanf("%d%d%d",&n,&f,&m);
	for(int i=1;i<=f;i++)
	scanf("%d",&num[i]);
	int x,y,z;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	int a=0x3f3f3f3f;
	for(int i=1;i<=n;i++)
	{	
		spfa(i);
		for(int j=1;j<=f;j++)
		{
			ans[i]+=dis[num[j]];
		}
	}
	int b;
	for(int i=1;i<=n;i++)
	{

		if(a>ans[i])
		b=i,a=ans[i];
	}
	printf("%d",b);
}

  

posted @ 2020-08-06 10:38  岚默笙  阅读(72)  评论(0编辑  收藏  举报