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

浙公网安备 33010602011771号