图论-最小生成树<Kruskal>
以上是昨天的Blog,有需要者请先阅读完以上再阅读今天的Blog。
可能今天的有点乱,好好理理,认真看完相信你会懂得
然而,文中提到的所有的算法在本人Blog中都会后期有讲解。推荐Blog
分割线
第三天
引子:昨天我们简单讲了讲最小生成树<Dijkstra,Floyd>算法,今天的课程就开始啦!
今天我们要讲的是:最小生成树
Top1:概念
最小生成树,听起来好像是树呀,为什么会是图论呢?其实,处理最小生成树问题前给出的东西,就是一个图,只不过进行操作后要求变成一个最小生成树罢了。
那什么是最小生成树呢?
我们把这个词语拆开来看。
树 ,我们都好理解,父亲儿砸祖先啥的如果不知道的话......先百度完树再来看吧 ,那么我们根据树的特性可以得出一个结论:
最小生成树是没有环的
生成树 ,就是一个点到另一个点的路径是 唯一的 ,(可以通过树的无环性质证明),也就是 一个用N-1条边连接的树,且所有点到其他点的路径唯一
最小 代表最终生成树的边权和最小(不知道什么是边权的到博主的Blog里面去看吧)。
这里就有一个问题了:为什么会是N-1条边呢,而不是N-2或者N+1条边?
既然要把N个点用最少数量的边(这里不是上面“最小”的定义)将所有点连接起来,(忽略边权)上过小学的都知道,将两个点连起来是要一条边,三个点要两条边,哪里见过三个点用一条边连起来的?用N条边或N+1条边(即上述例子的三条边或四条边),自然就会浪费边了。
主要还是靠自己动手画图思考。
Top2:算法-Kruskal
概念我们讲完了,进入正题。
其实最小生成树还有个算法叫做Prim,Prim算法和Kruskal算法在于,一个在稀疏图中更快,一个在稠密图中更快。然而,Kruskal在比赛中会更好用。
那讲了这么多,Kruskal到底怎么用呢?
我们都知道了树没有环,那么只需要每次取权值最小的边,只要加入这条边之后不行成环,就可以了。
有点像贪心,但是要判断有没有环。
怎么判断有环没环呢?
——并查集
所以代码就很简答啦!
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5000 + 10;
struct Line{
int x, y;
int dis;
bool operator < (const Line& next) const {
return dis > next.dis;
}
};
priority_queue<Line> line;
int n, m, now;
int fa[MAXN];
int ans;
inline int read(){
int f = 1, x = 0;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
{
x = x * 10 + c - '0';
c = getchar();
}
return f * x;
}
int find(int x){
if(fa[x] == x)return x;
return fa[x] = find(fa[x]);
}
int main(){
n = read(),m = read();
for(int i = 1;i <= m; i++){
int x,y,z;
x = read(),y = read(),z = read();
Line tot = {x,y,z};
line.push(tot);
}
for(int i = 1;i <= n; i++){
fa[i] = i;
}
while(!line.empty()){
Line tot = line.top();
line.pop();
int nx = tot.x, ny = tot.y;
if(find(nx) == find(ny)){
continue;
}
fa[find(nx)] = find(ny);
ans += tot.dis;
now++;
if(now == n - 1){
printf("%d",ans);
return 0;
}
}
puts("orz");
return 0;
}
至于Prim吗......博主太菜,告辞!
图论-最小生成树<Kruskal>的更多相关文章
- 图论-最小生成树-Kruskal算法
有关概念: 最小生成树:在连通图G中,连接图G所有顶点且总权最小的边构成的树 思路: 首先对边按权从小到大排序,紧接着枚举每一条边,如果两个结点的祖先结点不同(并查集),则连上此边,直到边数等于结点数 ...
- 关于最小生成树 Kruskal 和 Prim 的简述(图论)
模版题为[poj 1287]Networking. 题意我就不说了,我就想简单讲一下Kruskal和Prim算法.卡Kruskal的题似乎几乎为0.(●-`o´-)ノ 假设有一个N个点的连通图,有M条 ...
- 模板——最小生成树kruskal算法+并查集数据结构
并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时 合并:(我的祖先是的你的祖先的父亲) 找父亲:(初始化祖先是自己的,自己就是祖先) 查询:(我们是不是同一祖先) 路径压缩:(每 ...
- 最小生成树——Kruskal与Prim算法
最小生成树——Kruskal与Prim算法 序: 首先: 啥是最小生成树??? 咳咳... 如图: 在一个有n个点的无向连通图中,选取n-1条边使得这个图变成一棵树.这就叫“生成树”.(如下图) 每个 ...
- 【转】最小生成树——Kruskal算法
[转]最小生成树--Kruskal算法 标签(空格分隔): 算法 本文是转载,原文在最小生成树-Prim算法和Kruskal算法,因为复试的时候只用到Kruskal算法即可,故这里不再涉及Prim算法 ...
- CF1253F Cheap Robot(神奇思路,图论,最短路,最小生成树/Kruskal 重构树/并查集)
神仙题. 先考虑平方级别的暴力怎么做. 明显答案有单调性,先二分 \(c\). 先最短路预处理 \(dis_u\) 表示 \(u\) 到离它最近的充电站的距离(一开始把 \(1\) 到 \(k\) 全 ...
- 图论——最小生成树:Prim算法及优化、Kruskal算法,及时间复杂度比较
最小生成树: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.简单来说就是有且仅有n个点n-1条边的连通图. 而最小生成树就是最小权 ...
- 数据结构之 图论---最小生成树(prim + kruskal)
图结构练习——最小生成树 Time Limit: 1000MS Memory limit: 65536K 题目描述 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的.现在我们想知 ...
- 最小生成树 kruskal算法 codevs 1638 修复公路
1638 修复公路 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description A地区在地震过后,连接所有村庄的公 ...
随机推荐
- 使用git管理github上的代码
第一次接触git是使用git来提交自己的github的代码,在new repository之后,github会给出一些操作示例. 示例如下: …or create a new repository o ...
- Django-多对多关系的三种创建方式-forms组件使用-cookie与session-08
目录 表模型类多对多关系的三种创建方式 django forms 组件 登录功能手写推理过程 整段代码可以放过来 forms 组件使用 forms 后端定义规则并校验结果 forms 前端渲染标签组件 ...
- css超出多行隐藏
单行隐藏: overflow: hidden;/*超出部分隐藏*/ text-overflow:ellipsis;/* 超出部分显示省略号 */ white-space: nowrap;/*规定段 ...
- C++进程间通讯方式
1.剪切板模式. 在MFC里新建两个文本框和两个按钮,点击发送按钮相当于复制文本框1的内容,点击接收按钮相当于粘贴到文本框2内: 发送和接收按钮处功能实现如下: void CClipboard2Dlg ...
- Mysql 笔记(一)
InnoDB存储引擎 mysql 存储引擎(好难用,看https://www.zybuluo.com/eqyun/note/27850) 简介 InnoDB是事务安全的MySQL存储引擎,从MySQL ...
- 23种设计模式之原型模式(Prototype Pattern)
原型模式 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 分析: 孙悟空:根据自己的形状复制(克隆)出多个身外身 软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对象 ...
- Eureka实战-1【Eureka Server在线扩容】
1.准备工作 PS:为了偷懒,每个pom文件都要依赖的公共依赖配置放在下面: <parent> <groupId>org.springframework.boot</gr ...
- java List转换和数组互转
1.List转Array ArrayList<String> list=new ArrayList<String>(); String[] strings = new Stri ...
- mysql having和using使用
1.having当用到聚合函数sum,count后,又需要筛选条件时,就可以考虑使用having,因为where是在聚合前筛选记录的,无法和统计函数一起使用,而having在聚合后筛选记录,可以和统计 ...
- more,less,head,tail
当用cat,tac命令查看文件时,文件的所有内容都会被刷出来,因为缓存有限,被刷过去的内容可能就留不住了.用cat查看个小文件还可以,查看大文件时就用到下面的命令. more (选项)(参数) ...