最小生成树之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算法就大显身手了 ...
随机推荐
- uniapp导航栏自定义按钮及点击事件
本文链接:https://blog.csdn.net/qq_33807889/article/details/89945674第一步:显示按钮假设页面名称为:AddSort 在pages.json中找 ...
- hibernate ifnull
mysql中sql语句的ifnull函数,在hibernate的hql中可用coalesce代替. 例: mysql的sql:select ifnull(max(sort),0) from table ...
- JavaScript中的bind,call和apply函数的用法和区别
一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式, ...
- IDEA离线更新
因为在hosts文件添加以下dns添加 0.0.0.0 account.jetbrains.com 0.0.0.0 www.jetbrains.com 导致IDEA自动更新失败.手工下载回更新文件IU ...
- C基础知识(12):可变参数
该功能需要使用<stdarg.h>.函数的最后一个参数写成省略号,即三个点号(...),省略号之前的那个参数是int,代表了要传递的可变参数的总数.该文件提供了实现可变参数功能的函数和宏. ...
- httplib/urllib实现
httplib模块是一个底层基础模块,可以看到建立HTTP请求的每一步,但是实际的功能比较少.在python爬虫开发中基本用不到 下面详细介绍httplib提供的常用类型和方法: httplib.HT ...
- 使用robotframework做接口测试4——搞定接口签名及密码加密
接口签名是我做接口测试撞到的第一块石头,刚到新公司,本来想默默憋出来一个大招,然后碰到了签名接口,直接给跪了.于是只好找开发哥哥帮忙,把签名算法的java文件拿到,一行行对着用python实现了一遍. ...
- 【ABAP系列】SAP Smartforms 设置纸张打印格式
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP Smartforms 设 ...
- Ubuntu安装deepin wine版QQ
1.安装deepin wine环境 https://github.com/wszqkzqk/deepin-wine-ubuntu 直接下载zip包(或者用git方式克隆) 使用unzip解压到指定文件 ...
- Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)
Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. ...