Kruskal算法模版
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算法模版相关推荐
- HDU2988(Kruskal算法模版)
其实以下两种方法的实质本来就是一样的,就是在写的形式不一样而已!只要理解就可以了! 方法一: #include<iostream> #include<algorithm> #i ...
- 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)
目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...
- 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)
#include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...
- Kruskal算法 - C语言详解
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总 ...
- 【数据结构】最小生成树 Prim算法 Kruskal算法
最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...
- ds图—最小生成树_Java: Kruskal算法生成最小生成树(邻接矩阵)
Java: Kruskal算法生成最小生成树(邻接矩阵): package 输出: Kruskal=36: (E,F) (C,D) (D,E) (B,F) (E,G) (A,B) 分析: Java: ...
- 生成树的概念,最小生成树Prim算法 Kruskal算法
求解最小生成树可以用Prim算法 Kruskal算法
- Kruskal算法构造最小生成树
问题[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) ...
- Prim算法和Kruskal算法求最小生成树
Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...
最新文章
- SessionID 的本质
- 计算机组成原理数据冒险的解决nop,计算机组成原理实验讲义(103页)-原创力文档...
- 【深度学习】近几年,关于基于Imagenet数据集图像分类的模型总结
- PC 上访问设备数据库的方法
- node工程默认url_node命令行工具之实现项目工程自动初始化的标准流程
- C++对于文件的相关操作 创建、读写、删除代码
- C# 文件流相关操作
- [译]R语言——Shiny框架之构建(一):1.结构——1.独立应用程序——2.双文件式Shiny应用
- VMware虚拟机安装及虚拟机下安装XP系统
- Java后台调用高德地图api返回{status:0,info:UNKNOWN_ERROR,infocode:20003}
- 经典逻辑题笔试题和答案(不断更新)
- 转贴: 傅立叶级数(Fourier Series) 推导
- 每月自评之四:2013年4月
- 安卓4.4pppoe拨号间隔及轮次修改
- IMP-00017: following statement failed with ORACLE error 20005:(表统计信息被锁)
- 即将被社会淘汰的五种人
- 中国人民公安大学 网络对抗技术 15网安六区 杨益 201521460031
- 关于opencv环境搭建问题:由于找不到opencv_world440d.dll,无法执行代码,重新安装程序可能会解决此问题
- 高校车辆管理系统/车辆管理系统的设计与实现
- 激励名言 摘抄其他编程人员的话