Prime算法 与 Kruskal算法求最小生成树模板
算法原理参考链接 ==> UESTC算法讲堂——最小生成树
关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/53132681
故稀疏图用 Kruskal、稠密图用 Prime、空间足够情况下都用 Prime + Heap 优化
下面的模板都是解决这一道题的模板

Prime模板
邻接矩阵版
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
;
int G[maxn][maxn], Dis[maxn], N;
bool vis[maxn];
int Prime(int st)
{
;
; i<=N; i++)
vis[i] = false,
Dis[i] = G[st][i];
vis[st] = true;
; i<N; i++){
int v, Min = INF;
; j<=N; j++){
if(!vis[j] && Dis[j]<Min){
Min = Dis[j];
v = j;
}
}
Cost += Dis[v];
vis[v] = ;
; j<=N; j++){
if(!vis[j] && Dis[j] > G[v][j]){
Dis[j] = G[v][j];
}
}
}
return Cost;
}
int main(void)
{
while(~scanf("%d", &N)){
; i<=N; i++)
; j<=N; j++)
scanf("%d", &G[i][j]);
printf());
}
;
}
邻接表 + 堆优化
#include<bits/stdc++.h>
using namespace std;
;
struct EDGE{ int v, nxt, w; };
struct NODE{ int v, cost;
NODE(int vv, int cc):v(vv), cost(cc){};
bool operator < (const NODE &rhs)const{
return this->cost > rhs.cost;
};
};
EDGE Edge[maxn*maxn];
bool vis[maxn];
int Head[maxn];
int N, cnt;
inline void init()
{
; i<=N; i++)
Head[i]=-,vis[i]=false;
cnt = ;
}
inline void AddEdge(int from, int to, int weight)
{
Edge[cnt].v = to;
Edge[cnt].w = weight;
Edge[cnt].nxt = Head[from];
Head[from] = cnt++;
}
int Prime(int st)
{
;
NODE tp(st, );
priority_queue<NODE> que;
que.push(tp);
;
while(!que.empty() && EdgeCnt<cnt){
tp = que.top(); que.pop();
if(vis[tp.v]) continue;
else vis[tp.v] = true;
Cost += tp.cost;
EdgeCnt++;
; j=Edge[j].nxt){
if(!vis[Edge[j].v])
que.push(NODE(Edge[j].v, Edge[j].w));
}
}
return Cost;
}
int main(void)
{
while(~scanf("%d", &N)){
init();
int Val;
; i<=N; i++){
; j<=N; j++){
scanf("%d", &Val);
if(Val){
AddEdge(i, j, Val);
}
}
}
printf());
}
;
}
邻接表 + 配对堆优化
#include<bits/stdc++.h>
#include<ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;
using namespace std;
;
struct EDGE{ int v, nxt, w; };
typedef pair<int, int> pii;
EDGE Edge[maxn*maxn];
bool vis[maxn];
int Head[maxn];
int N, cnt;
inline void init()
{
; i<=N; i++)
Head[i]=-,vis[i]=false;
cnt = ;
}
inline void AddEdge(int from, int to, int weight)
{
Edge[cnt].v = to;
Edge[cnt].w = weight;
Edge[cnt].nxt = Head[from];
Head[from] = cnt++;
}
int Prime(int st)
{
;
__gnu_pbds::priority_queue< pii, greater<pii>, pairing_heap_tag > que;
que.push(make_pair(, st));
;
while(!que.empty() && EdgeCnt<cnt){
pii tp = que.top(); que.pop();
int v = tp.second;
if(vis[v]) continue;
else vis[v] = true;
Cost += tp.first;
EdgeCnt++;
; j=Edge[j].nxt){
if(!vis[Edge[j].v])
que.push(make_pair(Edge[j].w, Edge[j].v));
}
}
return Cost;
}
int main(void)
{
while(~scanf("%d", &N)){
init();
int Val;
; i<=N; i++){
; j<=N; j++){
scanf("%d", &Val);
if(Val){
AddEdge(i, j, Val);
}
}
}
printf());
}
;
}
Kruskal模板
#include<bits/stdc++.h>
using namespace std;
;//最大点数
int c[maxn], N;//并查集使用
int cnt;
struct EDGE{
int from, to, w;
bool operator < (const EDGE &rhs) const{
return this->w < rhs.w;
};
}Edge[maxn*maxn];//储存边的信息,包括起点/终点/权值
inline void init()
{
; i<=N; i++)
c[i] = i;
cnt = ;
}
inline void AddEdge(int from, int to, int weight)
{
Edge[cnt].from = from;
Edge[cnt].to = to;
Edge[cnt].w = weight;
cnt++;
}
int Findset(int x)
{
int root = x;
while(c[root] != root)
root = c[root];
int idx;
while(c[x] != root){ /// 路径压缩
idx = c[x];
c[x] = root;
x = idx;
}
return root;
}
int Kruskal()//传入点数,返回最小生成树的权值,如果不连通返回-1
{
sort(Edge,Edge+cnt);
;//计算加入的边数
;
;i<cnt;i++){
int R1 = Findset(Edge[i].from);
int R2 = Findset(Edge[i].to);
if(R1 != R2){
Cost += Edge[i].w;
c[R1]=R2;
EdgeCnt++;
}
) break;
}
) ;//不连通
else return Cost;
}
int main()
{
while(~scanf("%d", &N)){
init();
int Val;
; i<=N; i++){
; j<=N; j++){
scanf("%d", &Val);
if(Val){
AddEdge(i, j, Val);
}
}
}
printf("%d\n", Kruskal());
}
;
}
Prime算法 与 Kruskal算法求最小生成树模板的更多相关文章
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
- 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...
- C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)
1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...
- 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...
- 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)
普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...
- Prim算法、Kruskal算法、Dijkstra算法
无向加权图 1.生成树(minimum spanning trees) 图的生成树是它一棵含有所有顶点的无环联通子图 最小生成树:生成树中权值和最小的(所有边的权值之和) Prim算法.Kruskal ...
- 最小生成树两个经典算法(Prime算法、Kruskal算法) - biaobiao88
经典的最小生成树例子,Prime算法,具体的步骤及其注释本人均在代码中附加,请仔细阅读与品味,要求,可以熟练的打出. //Prime算法基础 #include<iostream> usin ...
- 最小生成树-Prim算法与Kruskal算法
一.最小生成树(MST) ①.生成树的代价:设G=(V,E)是一个无向连通网,生成树上各边的权值之和称为该生成树的代价. ②.最小生成树:在图G所有生成树中,代价最小的生成树称为最小生成树. 最小生成 ...
- (学习1)最小生成树-Prim算法与Kruskal算法
最小生成树: 求一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 1:Prim算法(适合稠密图) 伪代码: Prim(G){ //G ...
- 最小生成树的Prim算法以及Kruskal算法的证明
Prime算法的思路:从任何一个顶点开始,将这个顶点作为最小生成树的子树,通过逐步为该子树添加边直到所有的顶点都在树中为止.其中添加边的策略是每次选择外界到该子树的最短的边添加到树中(前提是无回路). ...
随机推荐
- RFC、EMCA-262、TC-39等名词
请求意见稿(英语:Request For Comments,缩写:RFC)是一系列备忘录. The RFC series contains technical and organizational d ...
- winform控件CxFlatUI
CxFlatUI https://github.com/HuJinguang/CxFlatUI 当前控件 AlertBox Button CheckBox DatePicker GroupBox ...
- IDEA开发环境设置
IDEA开发环境设置 1.关闭自动更新 IntelliJ IDEA默认会自动进行版本的更新,在网络异常时经常会导致各种各样的问题,因此强烈建议关闭自动更新. File->Settings 2.隐 ...
- JQ判断div是否隐藏
1. $("#tanchuBg").css("display") 2. $("#tanchuBg").is(":visible ...
- 链表两数相加(add two numbers)
问题 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它 ...
- 前端 CSS的选择器 高级选择器
高级选择器分为: 后代选择器 儿子选择器 并集选择器 交集选择器 后代选择器 使用空格表示后代选择器.父元素的后代(包括儿子,孙子,重孙子) 后代选择器 在CSS中使用非常频繁 因为HTML元素可以嵌 ...
- Android之异步调用
概述 AsyncTask可以很好的,准确的使用UI线程,他可以将一个比较耗时(几秒钟)的动作运行在后台,并且能将结果返回至UI线程中,不需要通过(Thread操作和Handler操作). 使用时必须通 ...
- sqlMap.xml配置文件中迭代一个集合的方式
比如:根据班级号查询学生的信息,参数是list 1.foreach的用法:[写法一] <select id="getStudentListByClassId" resultM ...
- spark浅谈(1):RDD
一.弹性分布式数据集 1.弹性分布式数据集(RDD)是spark数据结构的基础.它是一个不可变的分布式对象的集合,RDD中的每个数据集都被划分为一个个逻辑分区,每个分区可以在集群上的不同节点上进行计算 ...
- 微信小程序倒计时实现功能
onLoad: function () { var that=this; this.data.intervarID= setInterval(function () { var ...