题目链接: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;
}