• ACwing(基础)--- Kruskal


    Kruskal算法(适用于稀疏图)

    1、将所有边按权重从小到大排序 O(mlogn)
    2、枚举每条边a,b,权重c O(m)
    if a,b不连通
    将这条边加入集合中

    判断连通

    • 使用并查集来判断两个连通块是否连通
    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int M = 2e5+10;
    int n,m;
    int fa[M];//并查集的父节点数组
    struct edge { //存储边
    	int a,b,w;
    } edges[M];
    
    bool cmp(edge a, edge b) {
    	return a.w<b.w; //边的权重从小到大
    }
    void init() {
    	for(int i=1; i<=n; i++) fa[i]=i;
    }
    int find(int x) {
    	return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    
    void kruskal() {
    	sort(edges,edges+m,cmp);
    	int res=0,cnt=0;
    	for(int i=0; i<m; i++) {
    		int a=edges[i].a, b=edges[i].b,w=edges[i].w;
    		a=find(a),b=find(b);
    		if(a!=b) { // 如果两个连通块不连通,则将这两个连通块合并
    			fa[a]=b;
    			res+=w;
    			cnt++;
    		}
    	}
    	if(cnt < n-1) puts("impossible");
    	else cout<<res;
    }
    int main() {
    	cin>>n>>m;
    	for(int i=0; i<m; i++) {
    		int a,b,w;
    		cin>>a>>b>>w;
    		edges[i]= {a,b,w};
    	}
    	kruskal();
    	return 0;
    }
    
  • 相关阅读:
    VCC、VDD、VEE等区别
    Matlab运行速度/效率受哪些因素影响?
    strtok/atoi/atof/atol函数用法 详解
    双色球随机生成
    万能指针void*学习
    空指针和 指向指针的指针
    指针运算
    快速编译c/cpp文件
    贪吃蛇(C)
    判断规定时间内有无输入
  • 原文地址:https://www.cnblogs.com/bingers/p/13235827.html
Copyright © 2020-2023  润新知