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

浙公网安备 33010602011771号