最小生成树之Prim Kruskal算法(转)
最小生成树
Prim算法:
- //Prim
- struct edge{
- int to,len,next;
- }e[maxm];
- int box[maxn],cnt,used[maxn];
- void init(int n){
- for(int i=0;i<=n;i++)box[i]=-1;
- cnt=0;
- }
- void add(int from,int to,int len){
- e[cnt].to=to;
- e[cnt].len=len;
- e[cnt].next=box[from];
- box[from]=cnt++;
- }
- struct node{
- int v,len;
- node(){}
- node(int x,int y):v(x),len(y){}
- bool operator<(const node &x)const{
- return len>x.len;
- }
- };
- priority_queue<node> pq;
- int Prim(int n,int m){
- memset(used,0,sizeof(used));//初始化所有点,设状态为unseen
- int num=0,sum=0,now=1;
- do{
- used[now]=1;
- for(int t=box[now];t+1;t=e[t].next){
- int v=e[t].to,len=e[t].len;
- if(!used[v])pq.push(node(v,len));
- }
- while(!pq.empty()){
- node tmp=pq.top();pq.pop();
- int v=tmp.v,len=tmp.len;
- if(used[v])continue;
- now=v;
- sum+=len;
- break;
- }
- num++;
- }while(num<n);
- return sum;
- }
//Prim
struct edge{
int to,len,next;
}e[maxm];
int box[maxn],cnt,used[maxn];
void init(int n){
for(int i=0;i<=n;i++)box[i]=-1;
cnt=0;
}
void add(int from,int to,int len){
e[cnt].to=to;
e[cnt].len=len;
e[cnt].next=box[from];
box[from]=cnt++;
}
struct node{
int v,len;
node(){}
node(int x,int y):v(x),len(y){}
bool operator<(const node &x)const{
return len>x.len;
}
};
priority_queue<node> pq;
int Prim(int n,int m){
memset(used,0,sizeof(used));//初始化所有点,设状态为unseen
int num=0,sum=0,now=1;
do{
used[now]=1;
for(int t=box[now];t+1;t=e[t].next){
int v=e[t].to,len=e[t].len;
if(!used[v])pq.push(node(v,len));
}
while(!pq.empty()){
node tmp=pq.top();pq.pop();
int v=tmp.v,len=tmp.len;
if(used[v])continue;
now=v;
sum+=len;
break;
}
num++;
}while(num<n);
return sum;
}
Kruskal算法:
- #define maxn 110
- #define maxm 10010
- using namespace std;
- int uf[maxn];
- struct edge{
- int u,v,len;
- }e[maxm];
- bool cmp(const edge &x,const edge &y){
- return x.len<y.len;
- }
- void init(int n){//初始化并查集
- for(int i=0;i<=n;i++)uf[i]=i;
- }
- int find(int x){
- if(x==uf[x])return x;
- return uf[x]=find(uf[x]);
- }
- int Union(int x,int y){//合并两个集合(如果x,y在同一集合,返回0,否则返回1)
- x=find(x),y=find(y);
- if(x!=y){
- uf[x]=y;
- return 1;
- }
- return 0;
- }
- int Kruskal(int n,int m){//n个点,m条边
- sort(e,e+m,cmp);//排序
- int sum=0;//最小生成树的权值和
- for(int i=0;i<m;i++){//从小到大枚举边
- int u=e[i].u,v=e[i].v,len=e[i].len;
- sum+=len*Union(u,v);
- }
- return sum;//返回权值和
- }
#define maxn 110
#define maxm 10010
using namespace std;
int uf[maxn];
struct edge{
int u,v,len;
}e[maxm];
bool cmp(const edge &x,const edge &y){
return x.len<y.len;
}
void init(int n){//初始化并查集
for(int i=0;i<=n;i++)uf[i]=i;
}
int find(int x){
if(x==uf[x])return x;
return uf[x]=find(uf[x]);
}
int Union(int x,int y){//合并两个集合(如果x,y在同一集合,返回0,否则返回1)
x=find(x),y=find(y);
if(x!=y){
uf[x]=y;
return 1;
}
return 0;
}
int Kruskal(int n,int m){//n个点,m条边
sort(e,e+m,cmp);//排序
int sum=0;//最小生成树的权值和
for(int i=0;i<m;i++){//从小到大枚举边
int u=e[i].u,v=e[i].v,len=e[i].len;
sum+=len*Union(u,v);
}
return sum;//返回权值和
}
最小生成树之Prim Kruskal算法(转)的更多相关文章
- 最小生成树(prim&kruskal)
最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法: 原始的加权连通图——————D被选作起点,选与之相连的权值 ...
- 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...
- 最小生成树(II)与Kruskal算法
为防止网页加载过慢,故分两章.上接https://www.cnblogs.com/Uninstalllingyi/p/10479470.html Kruskal算法——将森林合并成树 玩过瘟疫公司吗… ...
- 邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
graph.c #include <stdio.h> #include <stdlib.h> #include <limits.h> #include " ...
- 最小生成树求法 Prim + Kruskal
prim算法的思路 和dijkstra是一样的 每次选取一个最近的点 然后去向新的节点扩张 注意这里的扩张 不再是 以前求最短路时候的到新的节点的最短距离 而是因为要生成一棵树 所以是要连一根最短的连 ...
- 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...
- 数据结构之 图论---最小生成树(prim + kruskal)
图结构练习——最小生成树 Time Limit: 1000MS Memory limit: 65536K 题目描述 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的.现在我们想知 ...
- 图解最小生成树 - 克鲁斯卡尔(Kruskal)算法
我们在前面讲过的<克里姆算法>是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的.同样的思路,我们也可以直接就以边为目标去构建,因为权值为边上,直接找最小权值的边来构建生成树 ...
- 最小生成树——Prim算法和Kruskal算法
洛谷P3366 最小生成树板子题 这篇博客介绍两个算法:Prim算法和Kruskal算法,两个算法各有优劣 一般来说当图比较稀疏的时候,Kruskal算法比较快 而当图很密集,Prim算法就大显身手了 ...
随机推荐
- springboot中如何启动tomcat
springboot启动时,会自动识别出当前环境是否是web环境还是非web环境. 默认的web环境的context(DEFAULT_WEB_CONTEXT_CLASS):org.springfram ...
- CI集成Smarty的实现方式
给新伙伴的忠告:不要去想着有多复杂,看一遍绝对就会弄了! 这样集成的目的是什么? 因为我使用过CI和smarty,所以我就按自己的理解讲一下:CI框架在控制器.models方面做的很好,但在多变的视图 ...
- vue-lazyload 的vue 懒加载的使用
vue-lazyload vue 图片懒加载的使用 下载 vue-lazyload npm i vue-lazyload -S 使用 vue-lazyload 在 src 下面的 main.js 的文 ...
- mysql数据库基本操作sql语言
mysql的启动与关闭 启动 /etc/init.d/mysql start 多实例使用自建脚本启动 2种关闭数据库方法 mysqladmin -uroot -p密码 shutdown #优雅关闭/e ...
- 连续子数组的最大和 java实现
package findMax; /** * 连续子数组的最大和 * @author root * */ public class FindMax { static int[] data = {1,- ...
- js window事件解析(转载)
js-window对象的方法和属性资料 hxpd 发表于 2007-05-08 21:58:18 熟练window对象的open.close.alert.confirm.prompt.setTimeo ...
- Django之缓存配置
01-什么是缓存 缓存(cache),其作用是缓和较慢存储的高频次请求,简单来说,就是加速满存储的访问效率. 02-几种缓存配置 # 内存缓存:local-memory caching CACHES ...
- flutter showModalBottomSheet max height
static void showBuyServiceDialog(BuildContext context) { showModalBottomSheet( context: context, isS ...
- python接口自动化框架搭建
一.在搭建接口自动化测试框架前,我觉得先需要想明白以下几点: ① 目前情况下,绝大部分接口协议是http,所以需要对http协议有个基本的了解,如:http协议请求.响应由哪些部分组成,常用的meth ...
- PGI 遇到的坑
以下记录为本人在使用PGI社区版编译器遇到的问题,包含两类问题 1,PGI编译器本身存在你的bug. 2,在其他编译器编译运行没问题,在PGI中出现问题. 版本(18.11社区版) 1,(bug)内置 ...