P3366 【模板】最小生成树
#include<bits/stdc++.h>
using namespace std;
int arr[5005][5005];//邻接矩阵
int brr[5005];//brr[i]存放未加入最小生成树的点与任意已加入生成树的点路径权值的最小值
int crr[5005];//crr[i]表示是否加入生成树
int main(){
int n,m;
memset(arr,0x7f,sizeof(arr));
memset(brr,0x7f,sizeof(brr));
brr[1]=0;
cin>>n>>m;
for (int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
if (z<arr[x][y]) arr[x][y]=arr[y][x] = z;
}
for (int i=1;i<=n;i++){
int k=0;
for (int j=1;j<=n;j++) {
if (!crr[j]&&brr[j]<brr[k]) k=j;
}
crr[k]=1;//k加入最小生成树
if (k==0){//整个过程一直没有找到路径,但是点还没有加入完,说明图不连通
cout<<"orz";
return 0;
}
for (int j=1;j<=n;j++) {//未加入最小生成树且与新加入的k点相连接的点,通过arr[k][j]更新brr[j]
if (!crr[j]&&arr[k][j]<brr[j]) brr[j]=arr[k][j];
}
}
int num=0;
for (int i=1;i<=n;i++){
num+=brr[i];
}
cout<<num;
return 0;
}
prim算法:从某一个顶点开始构建生成树;每次将权值最小的新顶点纳入生成树,直到所有顶点都纳入为止。