1.例如:求解如图的最小生成树

求解过程:




方法一:一般做法(最终都是在避环)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
int pre[maxx];
int rank[maxx];
struct node{int u,v;int cost;
}e[maxx];
int cmp(node a,node b){return a.cost<b.cost;
}
int mincost;
int n,m;
int flag[maxx];
void init(){mincost=0;for(int i=1;i<=n;i++){pre[i]=i;}memset(flag,0,sizeof(flag));memset(rank,0,sizeof(rank));
}
void Kruskal(){mincost=0;int cnt=0;int i=1;while(cnt<n){if(flag[e[i].u]==0&&flag[e[i].v]==0){mincost+=e[i].cost;cnt++;flag[e[i].u]=1;flag[e[i].v]=1;pre[e[i].u]=pre[e[i].v];}else if(flag[e[i].u]==0&&flag[e[i].v]==1){cnt++;mincost+=e[i].cost;flag[e[i].u]=1;pre[e[i].u]=pre[e[i].v];}else if(flag[e[i].u]==1&&flag[e[i].v]==0){cnt++;mincost+=e[i].cost;flag[e[i].u]=1;pre[e[i].v]=pre[e[i].u];}else{if(pre[e[i].u]!=pre[e[i].v]){mincost+=e[i].cost;cnt++;int temp=pre[e[i].v];for(int j=1;j<=n;j++){if(pre[j]==temp){pre[j]=pre[e[i].u];}}}}i++;}cout<<"最短路: "<<mincost<<endl;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){init();for(int i=1;i<=m;i++){scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].cost);}sort(e+1,e+m+1,cmp);Kruskal();}return 0;
}
/*
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 5 6
5 6 6
3 6 4
3 4 5
4 6 2
*/
方法二:并查集模版
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
int pre[maxx];
int rank[maxx];
struct node{int u,v;int cost;
}e[maxx];
int cmp(node a,node b){return a.cost<b.cost;
}
int mincost;
int n,m;
void init(){for(int i=0;i<maxx;i++){pre[i]=i;rank[i]=0;}
}
int find(int x){int r=x;if(pre[x]==r){return x;}return pre[x]=find(pre[x]);
}
void unio(int x,int y){int fx=find(x);int fy=find(y);if(rank[fx]<rank[fy]){pre[fx]=fy;}else{pre[fy]=fx;if(rank[fx]==rank[fy]){rank[fx]++;}}
}
void Kruskal(int m){mincost=0;int cnt=0;for(int i=1;i<=m;i++){int x=find(e[i].u);int y=find(e[i].v);if(x!=y){mincost+=e[i].cost;unio(x,y);cnt++;}if(cnt==n-1)break;}cout<<"最短路: "<<mincost<<endl;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){init();for(int i=1;i<=m;i++){scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].cost);}sort(e+1,e+m+1,cmp);Kruskal(m);}return 0;
}
/*
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 5 6
5 6 6
3 6 4
3 4 5
4 6 2
*/

Kruskal算法模版相关推荐

  1. HDU2988(Kruskal算法模版)

    其实以下两种方法的实质本来就是一样的,就是在写的形式不一样而已!只要理解就可以了! 方法一: #include<iostream> #include<algorithm> #i ...

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

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

  3. 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)

    #include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...

  4. Kruskal算法 - C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树.  例如,对于如上图G4所示的连通网可以有多棵权值总 ...

  5. 【数据结构】最小生成树 Prim算法 Kruskal算法

    最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...

  6. ds图—最小生成树_Java: Kruskal算法生成最小生成树(邻接矩阵)

    Java: Kruskal算法生成最小生成树(邻接矩阵): package 输出: Kruskal=36: (E,F) (C,D) (D,E) (B,F) (E,G) (A,B) 分析: Java: ...

  7. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  8. Kruskal算法构造最小生成树

    问题[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) ...

  9. Prim算法和Kruskal算法求最小生成树

    Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...

最新文章

  1. SessionID 的本质
  2. 计算机组成原理数据冒险的解决nop,计算机组成原理实验讲义(103页)-原创力文档...
  3. 【深度学习】近几年,关于基于Imagenet数据集图像分类的模型总结
  4. PC 上访问设备数据库的方法
  5. node工程默认url_node命令行工具之实现项目工程自动初始化的标准流程
  6. C++对于文件的相关操作 创建、读写、删除代码
  7. C# 文件流相关操作
  8. [译]R语言——Shiny框架之构建(一):1.结构——1.独立应用程序——2.双文件式Shiny应用
  9. VMware虚拟机安装及虚拟机下安装XP系统
  10. Java后台调用高德地图api返回{status:0,info:UNKNOWN_ERROR,infocode:20003}
  11. 经典逻辑题笔试题和答案(不断更新)
  12. 转贴: 傅立叶级数(Fourier Series) 推导
  13. 每月自评之四:2013年4月
  14. 安卓4.4pppoe拨号间隔及轮次修改
  15. IMP-00017: following statement failed with ORACLE error 20005:(表统计信息被锁)
  16. 即将被社会淘汰的五种人
  17. 中国人民公安大学 网络对抗技术 15网安六区 杨益 201521460031
  18. 关于opencv环境搭建问题:由于找不到opencv_world440d.dll,无法执行代码,重新安装程序可能会解决此问题
  19. 高校车辆管理系统/车辆管理系统的设计与实现
  20. 激励名言 摘抄其他编程人员的话

热门文章

  1. 美多后台管理和项目环境搭建
  2. 美多商城之用户中心(收货地址1)
  3. 深度学习神经网络 端到端的学习方式
  4. 防火墙产品原理与应用:NAT支持的特殊协议
  5. 静态NAT,动态NAT与NAPT区别
  6. Linux期末复习题库(4)
  7. C语言字符串大小写转换_只愿与一人十指紧扣_新浪博客
  8. 【分享】计算机视觉方向必备opencv基础知识总览
  9. Linux下通过txt文件导入数据到MySQL数据库
  10. 网络安全与机器学习(二):网络安全任务如何结合机器学习?