洛谷 P1546 最短网络 Agri-Net

Prim算法

题意

在n个农场间铺设光纤(也就是边),使所有的点形成一个连通图,求出所有边的值(最小花费)

做法

贪心模拟,从任意一个点出发,寻找边最短的一条,sum(初始值为0)加上边的值,在将这两个点看做一个整体,寻找他们周围边最短的一个点(注意:要用一个数组记录点是否处于这个整体中),直到找到所有的边,这时候的sum就是答案,输出即可。

代码

#include<bits/stdc++.h>
using namespace std;
int n;
int f[105][105];//输入输出的记录 
int v[105];//判重  
int d[105];//目前形成的树连接周围的点的最短距离 
int main()
{
    //freopen("agrinet.in","r",stdin);
    //freopen("agrinet.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
           scanf("%d",&f[i][j]);
    int k=1;//记录当前连接的边的个数 
    int p=1;//记录当前的点 
    int sum=0;//记录当前的消费 
    v[1]=1;//随便从第一个点开始 
    for(int i=2;i<=n;++i)
    {
       if(f[1][i]) d[i]=f[1][i];
       else d[i]=2e9;
    }//初始化 
    while(k<n)//连接n个点最多有(n-1)条边 
    {
        int q;//记录搜索到的消费最小的点 
        int minx=2e9;
        for(int i=1;i<=n;++i)
        {
            if(d[i]<minx&&!v[i])
            {
                minx=d[i];
                q=i;
            } 
        }
        sum+=minx;
        v[q]=1;
        for(int i=1;i<=n;++i)
        {
            if(!v[i])
                d[i]=min(d[i],f[q][i]);//更新 
        }
        ++k;
    }
    printf("%d\n",sum);
    return 0; 
}   

 

posted @ 2022-02-12 16:14  LikC1606  阅读(54)  评论(0)    收藏  举报