枚举每一个点是糖放的点的情况,暴力水过去了
#include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; #define ll long long #define M 5009 #define inf 0x3f3f3f3f int nxt[M],head[M],to[M],c[M],pos[M],visit[M],dist[M]; int n,m,p,cnt=0; ll ans=inf; queue<int> q; void init(){for (int i=0;i<M;i++) visit[i]=0,dist[i]=inf;} void add_edge(int x,int y,int z){to[++cnt]=y;c[cnt]=z;nxt[cnt]=head[x];head[x]=cnt;} void spfa(int o) { init(); q.push(o);visit[o]=1;dist[o]=0; while(!q.empty()) { int x=q.front();q.pop();visit[x]=0; for (int i=head[x];i;i=nxt[i]) { int y=to[i]; if (dist[x]+c[i]<dist[y]) { dist[y]=dist[x]+c[i]; if (!visit[y]) visit[y]=1,q.push(y); } } } } int main() { scanf("%d%d%d",&n,&p,&m); for (int i=1;i<=n;i++) scanf("%d",&pos[i]); for (int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add_edge(x,y,z);add_edge(y,x,z); } for (int i=1;i<=p;i++) { ll res=0; spfa(i); for (int i=1;i<=n;i++) res+=dist[pos[i]]; ans=min(res,ans); } printf("%lld\n",ans); return 0; }