(先更新到这,后面有时间再补,嘤嘤嘤)

今天给大家简单的讲一下最小生成树的问题吧!(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算法的更多相关文章

  1. 最小生成树——Kruskal与Prim算法

    最小生成树——Kruskal与Prim算法 序: 首先: 啥是最小生成树??? 咳咳... 如图: 在一个有n个点的无向连通图中,选取n-1条边使得这个图变成一棵树.这就叫“生成树”.(如下图) 每个 ...

  2. 图论篇2——最小生成树算法(kurskal算法&prim算法)

    基本概念 树(Tree) 如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree) 无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树. 生成 ...

  3. 关于最小生成树 Kruskal 和 Prim 的简述(图论)

    模版题为[poj 1287]Networking. 题意我就不说了,我就想简单讲一下Kruskal和Prim算法.卡Kruskal的题似乎几乎为0.(●-`o´-)ノ 假设有一个N个点的连通图,有M条 ...

  4. 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 思路:在保证不产生回 ...

  5. 最小生成树(Kruskal和Prim算法)

    关于图的几个概念定义:          关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vi与vj都有路 ...

  6. 最小生成树的kruskal、prim算法

    kruskal算法和prim算法 都说 kruskal是加边法,prim是加点法 这篇解释也不错:这篇 1.kruskal算法 因为是加边法,所以这个方法比较合适稀疏图.要码这个需要先懂并查集.因为我 ...

  7. 1.1.2最小生成树(Kruskal和Prim算法)

    部分内容摘自 勿在浮沙筑高台 http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意 ...

  8. 算法导论--最小生成树(Kruskal和Prim算法)

    转载出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶 ...

  9. Kruskal算法&Prim算法

    最小生成树是什么? Kruskal算法 图文转载自a2392008643的博客 此算法可以称为"加边法",初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最 ...

随机推荐

  1. git 命令笔记

    切换 git 远程仓库HEAD分支 $ git remote set-head origin some_branch

  2. Image Pipeline

    Image Pipeline Scrapy 提供了专门下载文件或者图片的Pipeline,下载图片与文件的原理同抓取网页的原理是一样的,所以他们的下载过程支持多线程与异步,十分的高效 Image Pi ...

  3. 漫画:一招学会TCP的三次握手和四次挥手

    TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地 ...

  4. linux 相关( 随时更新)

    Linux笔记: 本地文件传到服务器上: scp -P8022 /文件路径 niehaidong@101.201.75.57:/tmp/ 从服务器上到本地 scp -P8022  niehaidong ...

  5. .net core 使用swagger自动生成接口文档

     前言 swagger是一个api文档自动生动工具,还集成了在线调试. 可以为项目自动生成接口文档, 非常的方便快捷 Swashbuckle.AspNetCore 是一个开源项目,用于生成 ASP.N ...

  6. Linux密码重置

    在启动菜单选择启动内核: 按e编辑,编辑修改两处:ro改为rw,和找到rhgb quiet一行: 把rhgb quiet替换为init=/bin/bash(临时生效): 按CTRL+X进入单用户模式: ...

  7. 常见SMTP发送失败原因列表

    SmtpException:无法读取从传输连接数据:net_io_connectionclosed(SmtpException: Unable to read data from the transp ...

  8. EF Core 2.2 对多个 DbContext 多个数据库的情况进行迁移的示例

    目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 场景 在一个项目中,使用了多个 DbContext 且每个 DbContext 对应一个数据库的情况 创建新 ...

  9. Database Change Notification

    使用java监控oracle数据库的变化,主要是针对表数据,如果发生变化,使用select去查询,能够达到推送的目的 package com.test.notifi; import java.sql. ...

  10. 小程序实现GBK编码数据转为Unicode/UTF8

    首先,不存在一种计算算法将GBK编码转换为Unicode编码,因为这两套编码本身毫无关系. 要想实现两者之间的互转,只能通过查表法实现. 在浏览器中实现编码转换,只需要简单两句: var x = ne ...