2月16总结

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算法:从某一个顶点开始构建生成树;每次将权值最小的新顶点纳入生成树,直到所有顶点都纳入为止。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值