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

Guess you like

Origin blog.csdn.net/qq_43579980/article/details/110385029