Luogu P1546 最短网络 Agri-Net

  其实这道题根本没必要写,但为了测试vector+堆优化的Prim试一发。

  再次觉得Prim和Dijkstra很像,堆优化版本也差不多。

  和Dijkstra一样,Prim也是在之前的dis点中选取一个最短的,但不同是Prim是最短边长,而Dijkstra是到达该点的最短路长度。 

  既然是取最小的,堆自然就派上用场了。

  CODE

#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int N=105;
struct data
{
    int x,num;
    bool operator <(const data a) const
    {
        return a.x<x;
    }
};
priority_queue<data> tree;
vector <int> a[N],l[N];
int n,dis[N],ans,i,j,x;
bool f[N];
inline void read(int &x)
{
    x=0; char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
}
int main()
{
    memset(dis,63,sizeof(dis));
    read(n);
    for (i=1;i<=n;++i)
    for (j=1;j<=n;++j)
    {
        read(x);
        if (i!=j)
        {
            a[i].push_back(j);
            l[i].push_back(x);
        }
    }
    dis[1]=0;
    tree.push((data){0,1});
    while (!tree.empty())
    {
        int k=tree.top().num; tree.pop();
        if (f[k]) continue;
        f[k]=1; 
        ans+=dis[k];
        for (i=0;i<a[k].size();++i)
        {
            int now=a[k][i];
            if (dis[now]>l[k][i])
            {
                dis[now]=l[k][i];
                tree.push((data){dis[now],now});
            }
        }
    }
    printf("%d",ans);
    return 0;
}
辣鸡老年选手AFO在即
原文地址:https://www.cnblogs.com/cjjsb/p/7930701.html