洛谷P1546 最短网络 Agri-Net 最小生成树模板题

题目链接:https://www.luogu.com.cn/problem/P1546

已知图中点到点的距离,求最小生成树。直接用邻接矩阵即可,最小生成树模板题,我用的prime算法。
代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
const int inf=0xfffffff;
int vertex[maxn][maxn];//邻接矩阵
bool vis[maxn];//判断是否已在生成树中
int lowcost[maxn];//以某点为终点的最短距离
int n;
int prime()//求最小生成树
{
    int ans=0;//记录生成树长度
    vis[1]=true;//以编号为1的点为起始点
    for(int i=1;i<=n;i++)
    lowcost[i]=inf;
    for(int i=1;i<=n;i++)
    if(!vis[i]&&lowcost[i]>vertex[1][i])
    lowcost[i]=vertex[1][i];
    for(int i=1;i<n;i++)
    {
        int Mi=inf,t;
        for(int j=1;j<=n;j++)
        if(!vis[j]&&Mi>lowcost[j])//没在生成树中,找最短的
        Mi=lowcost[j],t=j;
        vis[t]=true;//将这个点加入生成树
        ans+=Mi;//更新生成树长度
        for(int j=1;j<=n;j++)
        if(!vis[j]&&lowcost[j]>vertex[t][j])//更新以到各点的最小值
        lowcost[j]=vertex[t][j];
    }
    return ans;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    scanf("%d",&vertex[i][j]);
    printf("%d\n",prime());
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44491423/article/details/104462219