昨天: 图论-最小生成树<Dijkstra,Floyd>

以上是昨天的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吗......博主太菜,告辞!

最新文章

  1. 收集移动端HTML5/H5使用的插件
  2. 如何在MVC_WebAPI项目中的APIController帮助页面添加Web测试工具测试
  3. UI3_视图切换
  4. 【BZOJ 1005】[HNOI2008]明明的烦恼
  5. 接口和JAVA设计模式
  6. centos6.5下Zabbix系列之Zabbix安装搭建及汉化
  7. [Ruby] LEVEL 2 Methods and Classes
  8. C++服务器设计(五):多设备类型及消息事件管理
  9. canvas arcTo()用法详解 – CodePlayer
  10. Struts2 工作流程
  11. SQL入门学习1-查询基础
  12. 如何安装和配置 Rex-Ray?- 每天5分钟玩转 Docker 容器技术(74)
  13. WPF 简易新手引导
  14. [BZOJ1014] [JSOI2008] 火星人prefix (splay &amp; 二分答案)
  15. 超简单的canvas绘制地图
  16. C语言博客作业04--数组
  17. 修改pip安装源加快python模块安装
  18. 九、JSP入门(2)
  19. 7.10 break.c 程序
  20. 01-简单编写http服务器

热门文章

  1. maven仓库 - nexus配置
  2. Python3.7.4入门-3函数
  3. .Net Core WebApi(二)在Windows服务器上部署
  4. Spark开发常用参数
  5. SpringSecurity原理剖析与权限系统设计
  6. opencv边缘检测-拉普拉斯算子
  7. maven scope属性说明
  8. XCTF-web2
  9. COGS 2095. 不平凡的引线
  10. DataStructure之线性表以及其实现