Kruskal算法(一)之 C语言详解
Prim 在稠密图中比 Kruskal 优,在稀疏图中比 Kruskal 劣。
Kruskal:时间复杂度由排序算法决定,若采用快排则时间复杂度为O(N*logN)

例题

Networking

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int pre[120010];//祖先
struct node{int x,y,w;
}t[120010];
bool cmp(node a,node b)
{return a.w<b.w;
}
int find(int x)
{while(a!=pre[a])a=pre[a];return a;
}
int merge(int x,int y)//合并
{int xx=find(x);int yy=find(y);if(xx!=yy){pre[xx]=yy;return 1;}else{return 0;}
}
int main()
{int n,m;while(cin>>n,n){cin>>m;for(int i=0;i<=n;i++)pre[i]=i;for(int i=0;i<m;i++)cin>>t[i].x>>t[i].y>>t[i].w;sort(t,t+m,cmp);int sum=0,num=0;for(int i=0;i<m;i++){if(merge(t[i].x,t[i].y)){sum++;num+=t[i].w;if(sum==n-1) break;}}cout<<num<<endl;}return 0;
}

Building a Space Station

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int pre[110];//祖先
//边
struct node{int x,y;double w;
}t[120010];
//球的坐标,半径
struct node2{double x,y,z,r;
}ball[200];
bool cmp(node a,node b)
{return a.w<b.w;
}
int find(int a)
{int i=a,j;while(a!=pre[a])a=pre[a];//压缩路径,提高效率//并查集中也可以用到while(i!=a){j=pre[i];pre[i]=a;i=j;}return a;
}
int judge(int x,int y)//检查
{int xx=find(x);int yy=find(y);if(xx!=yy){pre[xx]=yy;return 1;}else{return 0;}
}
int init()
{for(int i=0;i<=n;i++)pre[i]=i;
}
int main()
{while(cin>>n,n){int num=0;;init();for(int i=0;i<n;i++){cin>>ball[i].x>>ball[i].y>>ball[i].z>>ball[i].r;for(int j=0;j<i;j++){double s1=(ball[i].x-ball[j].x)*(ball[i].x-ball[j].x);double s2=(ball[i].y-ball[j].y)*(ball[i].y-ball[j].y);double s3=(ball[i].z-ball[j].z)*(ball[i].z-ball[j].z);double R=sqrt(s1+s2+s3)-(ball[i].r+ball[j].r);t[num].x=i;t[num].y=j;t[num++].w=R;}}sort(t,t+num,cmp);int numm=0;double sum=0;for(int i=0;i<num;i++){if(judge(t[i].x,t[i].y)){numm++;if(t[i].w>0)sum+=t[i].w; }if(numm==n-1) break;}printf("%.3f\n",sum);}return 0;
}

Jungle Roads

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=30;
const int M=150;
char c;
int n,num;
int pre[N];
struct node{int x,y,w;
}p[M];
bool cmp(node a,node b)
{return a.w<b.w;
}
int find(int x)
{return x==pre[x]?x:pre[x]=find(pre[x]);
}
void init()
{for(int i=0;i<=N;i++)pre[i]=i;
}
int kruskal()
{int test=1;int sum=0;for(int i=1;i<num;i++){if(test==n) break;int xx=find(p[i].x);int yy=find(p[i].y);if(xx!=yy){pre[xx]=yy;sum+=p[i].w;++test;}}return sum;
}
int main()
{while(cin>>n,n){num=1;init();for(int i=1;i<n;i++){int a;scanf("%c%d",&c,&a);cin>>c>>a;int use=c-'A';for(int j=1;j<=a;j++){cin>>c>>p[num].w;//不可直接对 p[num].w 使用 scanf p[num].x=use;p[num].y=c-'A';num++;}}sort(p+1,p+num,cmp);printf("%d\n",kruskal());}return 0;
}

Constructing Roads

#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <queue>
using namespace std;
const int MAX=110;
int pre[MAX];
int n;
int test=0;
int num=0;struct node{int x,y;int w;
}road[40010];bool cmp(node a,node b){return a.w<b.w;
}void init(int v){for(int i=0;i<=v;i++)pre[i]=i;
}int find(int x){return x==pre[x]?x:pre[x]=find(pre[x]);
}
bool join(int a,int b){int fa=find(a);int fb=find(b);if(fa!=fb){pre[fa]=fb;return 1;}return 0;
}
int kruskal(){int sum=0;for(int i=1;i<num;i++){if(test==n-1)break;if(join(road[i].x,road[i].y)){test++;sum+=road[i].w;}}return sum;
}
int main(){while(cin>>n){init(n);num=1;test = 0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>road[num].w;road[num].x=i;road[num].y=j;num++;}}int q;cin>>q;for(int i=0;i<q;i++){int a,b;cin>>a>>b;if(join(a,b))test++;}sort(road+1,road+num+1,cmp);cout<< kruskal() <<endl;}return 0;
}

Kruskal(克鲁斯卡尔)相关推荐

  1. JavaScript实现kruskal克鲁斯卡尔算法(附完整源码)

    JavaScript实现kruskal克鲁斯卡尔算法(附完整源码) DisjointSetItem.js完整源代码 DisjointSet.js完整源代码 Comparator.js完整源代码 Sor ...

  2. 算法笔记【1】 Kruskal - 克鲁斯卡尔算法

    Kruskal - 克鲁斯卡尔算法求最小生成树 本次所介绍的克鲁斯卡尔算法,从边的角度求网的最小生成树时间复杂度为O(NlogN).和普里姆算法恰恰相反,更适合于求边稀疏的网的最小生成树. 对于任意一 ...

  3. 最小生成树之Kruskal克鲁斯卡尔算法

    [图的最小生成树]之kruskal 目录 前言 一.什么是最小生成树 二.greedy algorithm贪婪算法和kruskal克鲁斯卡尔 1.greedy algorithm贪婪算法 2.krus ...

  4. (浙大-19-夏-数据结构)Prim(普里姆算法)和Kruskal(克鲁斯卡尔算法)最小生成树

    Prim最小生成树算法(贪心算法) 最小生成树的性质: 一棵树 没有回路 n 个顶点含有 n - 1 条边 生成树 所有顶点都在里面 n - 1 条边都在图中 边的权重最小 在生成树的图中任意加一条边 ...

  5. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  6. 算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树

    之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,就相当于先 ...

  7. 克鲁斯卡尔算法原理及JAVA代码

    原理 视频 最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示_哔哩哔哩_bilibili 文章 聊一聊数据结构图的克鲁斯卡尔算法 - 简书 (jianshu.com) 根据前 ...

  8. 十大算法之克鲁斯卡尔算法

    克鲁斯卡尔算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路 具体做法:首先构造一个只含n ...

  9. 克鲁斯卡尔算法(Kruskai)和普里姆算法(Prim)

    动画参考视频:最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示_哔哩哔哩_bilibili 克鲁斯卡尔算法(Kruskai) 克鲁斯卡尔算法,从边的角度求网的最小生成树,时间 ...

  10. 无向图的最小生成树(克鲁斯卡尔算法 Kruskal)

    引子: 克鲁斯卡尔算法的作用是:构建图的最小生成树. 克鲁斯卡尔算法 Kruskal的构造过程: 1.初始化图:n个顶点,n个连通分量(如果两个顶点的连通分量相同,表示两点在同一个连通图中).把所有的 ...

最新文章

  1. lightningJS之动画
  2. 手机照片导入电脑步骤_手机录屏及电脑录屏操作步骤
  3. 查看防火墙状态_干货 | 华为防火墙配置,这篇文章强烈推荐收藏学习
  4. angular字符串转成html,详解angular如何调用HTML字符串的方法
  5. MySQL查询select语句详解
  6. Ubuntu16.04 问题汇总
  7. java 二维数组位置_java 找到二维数组指定元素的位置
  8. java URL和URI
  9. 电脑桌面监控软件都能监控到什么?聊天记录?能防止企业员工泄密吗?
  10. iperf 安卓 灌包命令_iperf工具测速
  11. 显卡ai性能测试软件,让AI帮你自动超频 索泰RTX 2080Ti显卡性能测试
  12. 简述整车级电子电器架构开发内容
  13. php数独,详解PHP如何实现数独求解
  14. SpringBoot优缺点分析
  15. 将实时频谱分析仪与HIF输出配合使用
  16. FrontEnd笔记 -- Vue 核心
  17. dxp全称_ad对应的器件名称
  18. KNN和Kmeans比较
  19. 【饭谈】面试官:速斩此子,切不可引狼入室
  20. 后端存储课程笔记(大量实战经验)

热门文章

  1. 后端学习 - 操作系统
  2. Macos安装lightgbm时遇到的坑
  3. PhysX官方手册翻译
  4. 手机电池-市场现状及未来发展趋势
  5. 关于人像后期处理基础的相关技术步骤
  6. NFA转变为DFA的子集构造法
  7. CSS雪碧图制作emoji表情包
  8. 微信小程序新版canvas绘制图片方法
  9. 原创仿虎哥说车抖音文案,抖音策划,虎哥说车文案背景音乐,房子租凭宣传文案
  10. Java如何实现定时任务——从某一天起每天定点执行