Kruskal算法与Prim算法
(话说这么些算法的名字嗯。。。
Kruskal算法:(下文它就暂时叫k算法吧
k算法是一种应用贪心思想及并查集,在图中查找最小生成树的算法。
(最小生成树:若一个无向图内任意两个顶点联通切图为一棵树,此图即为生成树。在带权值无向图中权值和最小的生成树即为最小生成树。
时间复杂度:O(mlogm)//m为边数
算法思路:
1,读入图中各个边,将所有边权值从小到大排列加入集合S;
2,将图看作一个森林,初始每个顶点都为一棵独立的树;
3,从S中取出当前最短边(u,v),若选择这条边不会与其它已选边构成回路,则选择这条边并将u,v加入已知生成树的集合中;
4,重复上述操作直到生成树集合中包含所有点。
今天勤劳的小蜜蜂整个板子题:传送门
#include<bits/stdc++.h>
using namespace std;
const int N=5002,M=2e5+2;
int n,m;
int f[N],ans,cnt;
struct qwq{int u,v,w;
}e[M];
bool cmp(qwq x,qwq y){return x.w<y.w;}
int getf(int x){//并查集if(f[x]==x) return x;return f[x]=getf(f[x]);
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++) f[i]=i;for(int i=1;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].w;sort(e+1,e+m+1,cmp);int i;for(i=1;i<=m;i++){int fu=getf(e[i].u),fv=getf(e[i].v);if(fu==fv) continue;//若已有共同祖先,再选当前边会形成回路f[fu]=fv;ans+=e[i].w;cnt++;//记录连边条数if(cnt==n-1||cnt==m) break;//emm蒟蒻也不知道cnt==m是干啥的不加板子也能过}if(i!=m+1) cout<<ans;else cout<<"orz";return 0;
}
Prim算法:
Prim算法也是应用贪心思想,用于无向图中求最小生成树的算法,与k算法的区别在于Prim算法从点出发,而k算法从边出发。
时间复杂度:O(mlogn)//m为边数
算法思路:
1,任意选择一个点i,查找所有与其相连的点,选出未被标记且与i距离最小的点v,标记vis[v]=1;
2,重复上述操作直到所有点都被标记。
代码有点像迪杰斯特拉,就不注释了叭
#include<bits/stdc++.h>
#define ff(i,s,e) for(int i=s;i<=e;i++)
#define fir first
#define sec second
using namespace std;
inline int read(){register int x=0,f=1;register char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
}
const int N=5002,M=2e5+2;
int n,m,tot,ans;
int head[N],cnt;
struct qwq{int v,w,nxt;
}e[M<<1];
int dis[N];
bool vis[N];
typedef pair<int,int> pir;
priority_queue<pir,vector<pir>,greater<pir> >q;
void add(int u,int v,int w){e[++cnt].v=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
void prim(){memset(dis,0x3f,sizeof(dis));dis[1]=0;q.push(pir(0,1));while(!q.empty()&&tot<n){int d=q.top().fir,u=q.top().sec;q.pop();if(vis[u]) continue;tot++,ans+=d;vis[u]=1;for(int i=head[u];i;i=e[i].nxt){if(e[i].w<dis[e[i].v])dis[e[i].v]=e[i].w,q.push(pir(dis[e[i].v],e[i].v));}}
}
int main(){n=read(),m=read();int u,v,w;ff(i,1,m){u=read(),v=read(),w=read();add(u,v,w);add(v,u,w);}prim();if(tot==n) printf("%d",ans);else printf("orz");return 0;
}
完结撒花~
Kruskal算法与Prim算法相关推荐
- 最小生成树:Kruskal算法 和 Prim算法(第23章)
武侠: 飞雪连天射白鹿,笑书神侠倚碧鸳. --金庸十四著作 飞狐外传 .雪山飞狐 .连城诀 .天龙八部 .射雕英雄传 .白马啸西风 .鹿鼎记 .笑傲江湖 .书剑恩仇录 .神雕侠侣 .侠客岛 .倚天屠龙 ...
- Kruskal 算法与 Prim 算法
一:无向带权图的最小生成树 无向带权图是图论算法领域中的一种基础模型.它的代码实现我们就不在这篇文章中介绍了,大家可以参考文章后面给出的代码链接.下图为一个无向带权图的示例: 接下来我们着重介绍一下图 ...
- Kruskal算法和Prim算法
Kruskal算法和Prim算法 在无向图中,连通且不含圈的图称为树.给定一个无向图G=(V,E),连通G中所有点,且边集使E的子集的树称为G的生成树,其中权值最小的生成树称为最小生成树(MST).构 ...
- 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)
最小生成树: 生成树的定义:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树.(Spanning Tree) 最小生成树的定义:在生成树的基础上,如果边上有 ...
- 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)
今天学习下三个算法:动态规划算法.Prim算法.Dijkstra算法,将自己理解的逻辑略作总结. 1.动态规划算法是选取两个字符串的最长子序列的解法作为切入点学习,在公司午休时间将代码写了下,初步测试 ...
- 普里姆算法(Prim算法)
普里姆算法(Prim算法) 简介 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex ...
- * poj 1251 JungleRoad 最小生成树 Kruskal算法、Prim算法
文章目录 Kruskal算法 模板:https://blog.csdn.net/Rain722/article/details/65642992 Prim算法 模板: poj 1251 JungleR ...
- prim算法求最小生成树_最小生成树的两种方法(Kruskal算法和Prim算法)
关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...
- 最小生成树的两种方法(Kruskal算法和Prim算法)
关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...
最新文章
- gitee使用svn_Gitee SVN支持
- 基于python3写的源码剖析_Python 极简插件系统 pluggy 源码剖析
- Sql server日期函数操作
- Seurat的单细胞免疫组库分析来了!
- leetcode Distinct Subsequences
- 如何使用ISO升级TrueNAS主要版本
- Objective-C MVC
- Scikit-Learn 十大实用功能来袭!
- fastNLP工具包, 快速实现序列标注模型
- 用C#实现图片数据库存储与显示
- Uva 12063 Zero and Ones
- 关于SRTM精度的讨论[文摘]
- JavaScript表单基本验证
- php采集规则,dedecms采集规则怎么编写
- 佛系宿华和他的“信任电商”伪命题
- 工业相机常见的数据传输接口方式
- 一些Winodws mobile相关资料的整理
- 干掉Intel、AMD?国产处理器架构都有哪些?
- C语言struct用法详解
- 关于举办“2021全国高校计算机视觉实战暑期教师研修班”的通知