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算法的思路:从任何一个顶点开始,将这个顶点作为最小生成树的子树,通过逐步为该子树添加边直到所有的顶点都在树中为止.其中添加边的策略是每次选择外界到该子树的最短的边添加到树中(前提是无回路). ...
随机推荐
- 测开之路一百零四:jquery操作样式
jquery操作样式 添加样式.删除样式 切换样式 css("属性","值") css("属性","值"), 修改多个 ...
- Python3之异常处理
写自动化脚本时经常会用到异常处理,下面将python中的异常处理做一整理: 注意:以下所有事列中的111.txt文件不存在,所以会引起异常 用法一:try...except...else..类型 1. ...
- Linux下杀进程
$ ps -ef | grep firefox smx : ? :: /usr/lib/firefox-/firefox-bin smx : pts/ :: grep --color=auto fir ...
- WebServiceBinding属性
属性 类型 读 写 说明 ConformsTo Wsiprofiles x x 绑定需要遵守的WS-I标准 EmitConformanceClaims Boolean 如果为true,当WSD ...
- 实验报告3&学习总结
1.已知字符串:"this is a test of java".按要求执行以下操作: 统计该字符串中字母s出现的次数. 统计该字符串中子串"is"出现的次数. ...
- css定位:相对定位、绝对定位、固定定位的区别与特性
css定位:相对定位.绝对定位.固定定位的区别与特性 原文地址:http://www.qingzhouquanzi.com/106.html css定位常用的有以下三种: 使用了定位的共同特性: 这三 ...
- Codeforces 840C 题解(DP+组合数学)
题面 传送门:http://codeforces.com/problemset/problem/840/C C. On the Bench time limit per test2 seconds m ...
- C#设计模式:代理模式(Proxy Pattern)
一,什么是C#设计模式? 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 二,代码如下: using System; using System.Collectio ...
- Handle Refresh Token Using ASP.NET Core 2.0 And JSON Web Token
来源: https://www.c-sharpcorner.com/article/handle-refresh-token-using-asp-net-core-2-0-and-json-web ...
- OPECV的配置
因为要做一点道路是别的东西,所以想用到OPENCV的一些东西.在网上找了一些OPENCCSHARP的代码,但是这方面的书籍或者资料还是不是特别的多,所以我就觉得可能还不是很好.主要的原因还是因为自己的 ...