博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【模板】最小生成树
阅读量:5112 次
发布时间:2019-06-13

本文共 1089 字,大约阅读时间需要 3 分钟。

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz

输入输出格式

输入格式:

第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)

接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi

输出格式:

输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz

输入输出样例

输入样例#1: 
4 51 2 21 3 21 4 32 3 43 4 3
输出样例#1: 
7

说明

时空限制:1000ms,128M

数据规模:

对于20%的数据:N<=5,M<=20

对于40%的数据:N<=50,M<=2500

对于70%的数据:N<=500,M<=10000

对于100%的数据:N<=5000,M<=200000

样例解释:

所以最小生成树的总边权为2+2+3=7

 

分析:

本题是模板题,用Kruskal即可,具体实现就是将边按边权排序,并用并查集将相邻两边合并,直到所有的点都在一个并查集,最后输出答案。

 

CODE:

 

1 #include
2 #include
3 #include
4 using namespace std; 5 int n,m,ans; 6 int fa[100005*2]; 7 struct node{ 8 int u,v,w; 9 }a[100005*2];10 bool cmp(node x,node y){
return x.w
>n>>m;24 for (int i=1;i<=n;i++)25 fa[i]=i;26 for (int i=1;i<=m;i++)27 cin>>a[i].u>>a[i].v>>a[i].w;28 sort(a+1,a+m+1,cmp);29 for (int i=1;i<=m;i++)30 if (fa[findr(a[i].u)]!=fa[findr(a[i].v)])31 ans+=a[i].w,merge(a[i].u,a[i].v);32 cout<
<

 

转载于:https://www.cnblogs.com/kanchuang/p/11176745.html

你可能感兴趣的文章
struts.convention.classes.reload配置为true,tomcat启动报错
查看>>
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
Java 多态 虚方法
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
万能的SQLHelper帮助类
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>