Acwing 1127.香甜的黄油【SPFA】
作者:互联网
1.题目
题目链接
2.解决方法
题意就是在一张无向网中寻找一个顶点,使得该顶点到其他顶点的最短路径长度最小。每个顶点都做一次SPFA求单源最短路径,求出路径长度之和,在这些和中找出一个最小的,即为所求答案。
3.代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN=810,MAXM=3000,INF=0x3f3f3f3f;
int h[MAXN],e[MAXM],ne[MAXM],w[MAXM],idx,id[MAXN],dist[MAXN];
int n,p,m;
bool st[MAXN];
void add(int a,int b,int c)
{
e[idx]=b;
ne[idx]=h[a];
w[idx]=c;
h[a]=idx++;
}
int spfa(int start)//多源汇最短路问题:每个点都用spfa这种单源最短路径算法来得到每个点的多源汇距离
{
queue<int> q;
q.push(start);
memset(st,false,sizeof(st));
memset(dist,0x3f,sizeof(dist));
st[start]=true;
dist[start]=0;
while(!q.empty()){
int t=q.front();
q.pop();
st[t]=false;
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j]>dist[t]+w[i]){
dist[j]=dist[t]+w[i];
if(!st[j]){
st[j]=true;
q.push(j);
}
}
}
}
int res=0;
for(int i=0;i<n;i++){//统计所有牛到当前牧场的位置
int j=id[i];
if(dist[j]==INF) return INF;
res+=dist[j];
}
return res;
}
int main(void)
{
cin>>n>>p>>m;
for(int i=0;i<n;i++) cin>>id[i];
memset(h,-1,sizeof(h));
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
}
int res=INF;
for(int i=1;i<=p;i++) res=min(res,spfa(i));//得到最近的距离之和
cout<<res<<endl;
return 0;
}
标签:include,dist,idx,int,st,SPFA,MAXN,1127,Acwing 来源: https://blog.csdn.net/qq_43579980/article/details/110385029