最小生成树:Prim,kruskal

prim:以点为衡量

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

//prim
int main(){
    int v,e;
    cin>>v>>e;
    vector<vector<int>>graph(v+1,vector<int>(v+1,10001));

    while(e--){
        int v1,v2,val;
        cin>>v1>>v2>>val;
        graph[v1][v2]=val;
        graph[v2][v1]=val;
    }

    vector<int>minDist(v+1,10001);
    vector<bool>inTree(v+1,false);
    
    for(int i=0;i<v;i++){//只需要n-1次
    int cur=-1;
    int minval=INT_MAX; //在里面,每次都从max开始

    for(int j=1;j<=v;j++){
    if(!inTree[j]&&minval>minDist[j]){
        cur=j;
        minval=minDist[j];
    }//选出最小的一个
    }

    inTree[cur]=1;

    for(int k=1;k<=v;k++){
        if(!inTree[k]&&minDist[k]>graph[k][cur]){
            minDist[k]=graph[k][cur];
        }
    }

    }
    int res=0;
    for(int i=2;i<=v;i++){
        res+=minDist[i];
    }
    cout<<res<<endl;

}

kruskal:维护边的集合

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

struct Edges{
    int l,r,val;
};

vector<int>father(10001,0);

void init(){
    for(int i=1;i<10001;i++)father[i]=i;
}

int find(int u){
    if(u==father[u])return u;
    else return father[u]=find(father[u]);
}

void join(int u,int v){
    u=find(u);
    v=find(v);
    if(u==v)return;
    father[v]=u;
}

bool issame(int u,int v){
    u=find(u);
    v=find(v);
    if(u==v)return true;
    else return false;
}

bool cmp(Edges& a,Edges& b){
    return a.val<b.val;
}

int main(){
    init();//怎么又忘了!!!!!!!!输出都是0!!!!!
    int v,e;
    cin>>v>>e;
    vector<Edges>edges;
    while(e--){
        int l,r,val;
        cin>>l>>r>>val;
        edges.push_back({l,r,val});
    }
    sort(edges.begin(),edges.end(),cmp);
    int res=0;
    for(Edges edg:edges){
        int v1=edg.l;
        int v2=edg.r;
        if(!issame(v1,v2)){
            res+=edg.val;
            join(v1,v2);
        }
    }
cout<<res<<endl;
}
相关推荐
唐墨1231 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏2 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆6 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
老歌老听老掉牙6 小时前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso
笑容掩饰我的失落6 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black7 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_967979129 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔10 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆10 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac
老师我太想进步了202610 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法