最小生成树 kruskal算法&prim算法
(先更新到这,后面有时间再补,嘤嘤嘤)
今天给大家简单的讲一下最小生成树的问题吧!(ps:本人目前还比较菜,所以最小生成树最后的结果只能输出最小的权值,不能打印最小生成树的路径)
本Tianc在刚学的时候,经常把最小生成树问题和最锻炼吧问题弄混淆,最后事实证明这两个问题是存在着相似点的。
所以还是可以参照我上一篇的博客 https://www.cnblogs.com/laysfq/p/9808088.html(此处插个"广告")
最小生成树的实质问题还是求最短的路径(是吧?肯定是的!)
kruskal算法(用边进行更新)
我的kruskal算法中用到了并查集,这样的话比较好找父结点,它的具体过程是这样的:
先将他们的权值进行映射排序,然后从最小的权值里面的取出结点数,放到树里面作为根结点,然后用并查集进行连接,每连接一个点,
把这条边所对应的权值加进去,查询下一个结点。不断的更新,直到把所有的点全部放到树里面。
下面是代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = ;
int n,m;
int u[maxn], v[maxn], w[maxn], pre[maxn], r[maxn];
int fun(int i, int j) {
return w[i] < w[j];
}
int find(int x) {
return pre[x] == x ? x : pre[x] = find(pre[x]);
}
int kruskal() {
int ans = ;
for (int i = ; i < n; ++i) pre[i] = i;
for (int i = ; i < m; ++i) r[i] = i;
sort(r, r + m, fun);
for (int i = ; i < m; ++i) {
int temp = r[i];
int x = find(u[temp]);
int y = find(v[temp]);
if (x != y) {
pre[x] = y;
ans += w[temp];
}
}
return ans;
} int main() {
while (cin >> n>> m) {
for (int i = ; i < m; ++i) {
cin >> u[i] >> v[i] >> w[i];
}
cout << kruskal() << endl;
}
}

呃呃呃,上面是程序运行的结果,第一行的5和7表示的是结点数和边的数目,下面会输入7行,例如“1 2 5”,表示的是1和2之间的权值是5。
最后输出最小生成树中权值总和。
Prim算法(用点进行更新)
这个是用点进行更新的,先将权值最小的边找出来,然后把最小的边对应的两个结点放进图中,然后利用这两个点向外不断的扩展,依据就是找出和这两个点相连且权值最小的且不在图里面的点。直到最后将所有的点访问完,构成一棵最小生成树。
附上代码:
#include<iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = ;
bool vis[MAXN];
int lowc[MAXN];
int Prim(int cost[][MAXN], int n)//点是1-n
{
int ans = ;
memset(vis, false, sizeof(vis));
vis[] = true;
for (int i = ; i<=n; i++)lowc[i] = cost[][i];
for (int i = ; i<=n; i++)
{
int minc = INF;
int p = -;
for (int j = ; j<=n; j++)
if (!vis[j] && minc>lowc[j])
{
minc = lowc[j];
p = j;
}
if (minc == INF)return -;//原图不连通
ans += minc;
vis[p] = true;
for (int j = ; j<=n; j++)
if (!vis[j] && lowc[j]>cost[p][j])
lowc[j] = cost[p][j];
}
return ans;
} int main() {
int n, m;
int a, b, c;
int cost[MAXN][MAXN];
while (cin >> n >> m) {
for (int i = ; i <= n; ++i) {
for (int j = ; j <= n; ++j) {
if (i == j) cost[i][j] = ;
else cost[i][j] = INF;
}
}
for (int i = ; i < m; ++i) {
cin >> a >> b >> c;
cost[a][b] = cost[b][a] = c;
}
cout << Prim(cost, n)<<endl;
}
}
最小生成树 kruskal算法&prim算法的更多相关文章
- 最小生成树——Kruskal与Prim算法
最小生成树——Kruskal与Prim算法 序: 首先: 啥是最小生成树??? 咳咳... 如图: 在一个有n个点的无向连通图中,选取n-1条边使得这个图变成一棵树.这就叫“生成树”.(如下图) 每个 ...
- 图论篇2——最小生成树算法(kurskal算法&prim算法)
基本概念 树(Tree) 如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree) 无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树. 生成 ...
- 关于最小生成树 Kruskal 和 Prim 的简述(图论)
模版题为[poj 1287]Networking. 题意我就不说了,我就想简单讲一下Kruskal和Prim算法.卡Kruskal的题似乎几乎为0.(●-`o´-)ノ 假设有一个N个点的连通图,有M条 ...
- Kruskal和Prim算法求最小生成树
Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...
- 最小生成树(Kruskal和Prim算法)
关于图的几个概念定义: 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vi与vj都有路 ...
- 最小生成树的kruskal、prim算法
kruskal算法和prim算法 都说 kruskal是加边法,prim是加点法 这篇解释也不错:这篇 1.kruskal算法 因为是加边法,所以这个方法比较合适稀疏图.要码这个需要先懂并查集.因为我 ...
- 1.1.2最小生成树(Kruskal和Prim算法)
部分内容摘自 勿在浮沙筑高台 http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意 ...
- 算法导论--最小生成树(Kruskal和Prim算法)
转载出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶 ...
- Kruskal算法&Prim算法
最小生成树是什么? Kruskal算法 图文转载自a2392008643的博客 此算法可以称为"加边法",初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最 ...
随机推荐
- git 命令笔记
切换 git 远程仓库HEAD分支 $ git remote set-head origin some_branch
- Image Pipeline
Image Pipeline Scrapy 提供了专门下载文件或者图片的Pipeline,下载图片与文件的原理同抓取网页的原理是一样的,所以他们的下载过程支持多线程与异步,十分的高效 Image Pi ...
- 漫画:一招学会TCP的三次握手和四次挥手
TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地 ...
- linux 相关( 随时更新)
Linux笔记: 本地文件传到服务器上: scp -P8022 /文件路径 niehaidong@101.201.75.57:/tmp/ 从服务器上到本地 scp -P8022 niehaidong ...
- .net core 使用swagger自动生成接口文档
前言 swagger是一个api文档自动生动工具,还集成了在线调试. 可以为项目自动生成接口文档, 非常的方便快捷 Swashbuckle.AspNetCore 是一个开源项目,用于生成 ASP.N ...
- Linux密码重置
在启动菜单选择启动内核: 按e编辑,编辑修改两处:ro改为rw,和找到rhgb quiet一行: 把rhgb quiet替换为init=/bin/bash(临时生效): 按CTRL+X进入单用户模式: ...
- 常见SMTP发送失败原因列表
SmtpException:无法读取从传输连接数据:net_io_connectionclosed(SmtpException: Unable to read data from the transp ...
- EF Core 2.2 对多个 DbContext 多个数据库的情况进行迁移的示例
目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 场景 在一个项目中,使用了多个 DbContext 且每个 DbContext 对应一个数据库的情况 创建新 ...
- Database Change Notification
使用java监控oracle数据库的变化,主要是针对表数据,如果发生变化,使用select去查询,能够达到推送的目的 package com.test.notifi; import java.sql. ...
- 小程序实现GBK编码数据转为Unicode/UTF8
首先,不存在一种计算算法将GBK编码转换为Unicode编码,因为这两套编码本身毫无关系. 要想实现两者之间的互转,只能通过查表法实现. 在浏览器中实现编码转换,只需要简单两句: var x = ne ...