洛谷: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); }