P3366 最小生成树【模板+Kruscal讲解】
此题数组大小非常重要
算法过程:
- 现将全部边按照权值(由小到大)排序。
- 按顺序(同上)考虑每条边,只要这条边和之前已选择的边不构成圈,就保留这条边,否则放弃这条边。
具体算法
- 成功选择(n-1)条边后,形成一颗最小生成树,如果无法选择出(n-1)条边,则说明不连通。
- 当所有的点都连到一起时,执行结束。
为何是n-1条边呢?
上图形式可转化为下图形式【图中共有n个圆,共有(n-1)条边】
变!
是不是非常简单易懂?
在此附上详细代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int parent[];
int n,m;
int i,j;
struct edge
{
int u,v,w; //边的顶点,权值
}edges[];
//初始化并查集
void UFset()
{
for(i=;i<=n;i++)
parent[i] = -;
}
//查找i的根
int find(int i)
{
int temp;
//查找位置
for(temp=i;parent[temp]>=;temp=parent[temp]);
//压缩路径
while(temp!=i){
int t=parent[i];
parent[i]=temp;
i=t;
}
return temp;
}
//合并两个元素a,b
void merge(int a,int b){
int r1=find(a);
int r2=find(b);
int tmp=parent[r1] + parent[r2]; //两个集合结点数的和
if(parent[r1]>parent[r2])//秩排序 优化
{
parent[r1]=r2;
parent[r2]=tmp;
}else{
parent[r2]=r1;
parent[r1]=tmp;
}
}
void kruskal()
{
int sumWeight=;
int num=;
int u,v;
UFset();
for(int i=;i<m;i++)
{
u=edges[i].u;
v=edges[i].v;
//一个结点一个结点算
if(find(u)!=find(v))
{ //u和v不在一个集合(能够围成一个圈,即在同一个集合中)
sumWeight+=edges[i].w;//计算权值总和
num++;//计算次数,根据需要添加,可不加
merge(u,v); //把这两个边加入一个集合。
}
}
printf("%d \n",sumWeight);
}
//排序
int cmp(const void * a, const void * b){
edge * e1 = (edge *)a;
edge * e2 = (edge *)b;
return e1->w - e2->w;
}
int main() {
scanf("%d %d", &n,&m);
for(i=; i<m; i++)
{
scanf("%d %d %d", &edges[i].u,&edges[i].v,&edges[i].w);
}
qsort(edges,m,sizeof(edge),cmp);//按权值排序
kruskal();//
return ;
}
时间复杂度:O(NlogN)【N是结点个数】
Happy ending!
P3366 最小生成树【模板+Kruscal讲解】的更多相关文章
- luogu p3366 最小生成树模板
倒腾了一个小时 自己也没去看网上的 总算自己能写出来模板了 kruskal //最小生成树 每次找最短的边 #include<bits/stdc++.h> using namespace ...
- 洛谷P3366 【模板】最小生成树 题解
题目链接:https://www.luogu.org/problem/P3366 最小生成树模板题. Kruskal算法 算法思想:给边按边权从小到大排序,然后遍历每一条边,如果边上的两个点不在同一个 ...
- 洛谷P3366 【模板】最小生成树
P3366 [模板]最小生成树 319通过 791提交 题目提供者HansBug 标签 难度普及- 提交 讨论 题解 最新讨论 里面没有要输出orz的测试点 如果你用Prim写了半天都是W- 题目 ...
- P3366 【模板】最小生成树(boruvka/sollin)
P3366 [模板]最小生成树 boruvka/sollin 复杂度$O(mlogn)$ 简要说明一下过程 引入一个数组$link[i]$表示连通块$i$下一步可更新的最短的边的编号 1.每次枚举所有 ...
- 最小生成树 & 洛谷P3366【模板】最小生成树 & 洛谷P2820 局域网
嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...
- 【原创】洛谷 LUOGU P3366 【模板】最小生成树
P3366 [模板]最小生成树 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N ...
- 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...
- P3366【模板】最小生成树
P3366[模板]最小生成树 Kruskal #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ; ...
- hiho 1098 最小生成树二·Kruscal算法 (最小生成树)
题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析, ...
随机推荐
- MATLAB字符串处理
字符串处理 MATLAB中字符串用单引号 如果字符串中存在单引号,要使用两个单引号. length()元素个数 (1)字符串的执行 格式:eval(s) s表示字符串 abs()和double() ...
- Windows Server 2012 R2
Windows Server 2012 R2 历史上的Server有2003 server, 2008 server, 2012 server windows server 2012 r2对计算机的消 ...
- 延迟查询--LINQ
1.LINQ查询使用的是延迟查询的方法,以便提高效率 public static IEnumerable<TSource> Where<TSource>(this IEnume ...
- ADO.NET的主要对象
ADO.NET主要分为五个对象: 1)Connection对象:用来连接程序与数据库.没有利用连接对象将数据库打开,是无法从数据库中取得数据的.Close和Dispose的区别,Close之后还可以用 ...
- java并发编程 volatile关键字 精准理解
1.volatile的作用 一个线程共享变量(类的成员变量.类的静态成员变量等)被volatile修饰之后,就具有以下作用: 1)并发中的变量可见性(不同线程对该变量进行操作时的可见性),即一个线程修 ...
- ACM-单调队列用于DP优化
http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 待续
- Chrome浏览器正常,IE下界面却乱了
背景:项目实战中总会遇到一些小问题,IE特别多 Chrome浏览器页面正常,IE下界面就乱了 原因分析 1.首先想到的是代码有米有问题呢?主要指的是兼容性 2.兼容性没有问题,那我们打开IE的开发工具 ...
- 从今天开始学习Swift--关于Swift (转)
WWDC2014推出了新的编程语言,大家都站在了新的起跑线上,希望转发的本文能对园内的朋友一点介绍和帮助,如果大家对swift感兴趣,欢迎踊跃利用google. 原文地址:http://www.coc ...
- JS的定时到底有多不准
博客逐步迁移到,独立博客,原文地址,http://www.woniubi.cn/js_hide_tab_setinterval/ 我们一直都在说,JS的定时非常的不准确,但是很少有人去验证他,今天我就 ...
- android libs库中的armeabi-v7a,armeabi和x86
以下内容转载于:http://blog.csdn.net/liumou111/article/details/52949156 1.区别: 这三者都表示的是CPU类型,早期的Android系统几乎只支 ...