[洛谷P3366] [模板] 最小生成树
存个模板,顺便复习一下kruskal和prim。
kruskal
稀疏图上表现更优。
设点数为n,边数为m。
复杂度:O(mlogm)。
先对所有边按照边权排序,初始化并查集的信息。
然后枚举每一条边,如果当前边的两个端点不在一个并查集里,就选上这条边。
如果图不连通会造成选的边数小于n-1。
如果成功生成了最小生成树,就会正好选n-1条边(树的性质)。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; int n,m,cnt,ans; struct edge
{
int x,y,w;
}e[]; int f[]; int findfa(int p)
{
if(p==f[p])return p;
f[p]=findfa(f[p]);
return f[p];
} int cmp(edge q,edge r)
{
return q.w<r.w;
} void kruskal()
{
sort(e+,e+m+,cmp);
for(int i=;i<=m;i++)
{
int fx=findfa(e[i].x);
int fy=findfa(e[i].y);
if(fx==fy)continue;
ans+=e[i].w;
cnt++;
f[fx]=fy;
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)f[i]=i;
for(int i=;i<=m;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
kruskal();
if(cnt<n-)printf("orz");
else printf("%d",ans);
return ;
}
prim
稠密图上表现更优。
时间复杂度:O(nlogn+m)。
算法很像dijkstra求最短路。
只不过这个是维护某个点到已选的点组成的点集的距离,而不是到源点的距离。
初始先随便选一个点,把这个点的距离设为0,剩下的点的距离设为0x3f3f3f3f。
然后就很像dijkstra......
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; int n,m,cnt,ans;
int hd[],nx[],to[],len[],ec;
int dis[],v[]; void edge(int af,int at,int ev)
{
to[++ec]=at;
nx[ec]=hd[af];
len[ec]=ev;
hd[af]=ec;
} struct data
{
int ps,ds;
friend bool operator<(data q,data w)
{
return q.ds>w.ds;
}
}; priority_queue<data>qq; void prim()
{
memset(dis,0x3f,sizeof(dis));
dis[]=,cnt++;
qq.push((data){,});
while(!qq.empty()&&cnt<=n)
{
data p=qq.top();
qq.pop();
if(v[p.ps])continue;
v[p.ps]=;
cnt++;
ans+=p.ds;
for(int i=hd[p.ps];i;i=nx[i])
{
if((dis[to[i]]>len[i])&&(!v[to[i]]))
{
dis[to[i]]=len[i];
qq.push((data){to[i],dis[to[i]]});
}
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
edge(x,y,z);
edge(y,x,z);
}
prim();
if(cnt<n)printf("orz");
else printf("%d",ans);
return ;
}
[洛谷P3366] [模板] 最小生成树的更多相关文章
- 最小生成树 & 洛谷P3366【模板】最小生成树 & 洛谷P2820 局域网
嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...
- 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
随机推荐
- EXCEL快速实现下拉计算快捷键
ctrl + shift + 方向键,,选择要填充的范围,,然后ctrl + d
- ruoyi ShiroUtils
package com.ruoyi.framework.util; import org.apache.shiro.SecurityUtils; import org.apache.shiro.cry ...
- webgis笔记
3.8(02) .特点:由服务端进行数据管理 开源的GO sever WMS/WCS/WTS 1sever/2engine/3database/4standard 扩展的空间数据库,存矢量.栅格.直接 ...
- 微信小程序java8 java7 java6 encryptedData 解密 异常处理
使用java8 java7 java6 解密微信小程序encryptedData可以回遇到一些错误 1.java.security.NoSuchAlgorithmException: Cannot ...
- .net EasyTree显示所级层级(无限级、整层级颗树)的另类写法。非递归
获取整颗树的另类写法.非递归 //获取所有的菜单 List<T_Menu> menu = bll.getMenuByUsesrID("8189a7c1-6f15-4744-b6c ...
- rclone使用心得
https://rclone.org/ 一边使用一边更新. 0x00 常用rclone命令: 1) 复制:从remote1到remote2 rclone copy -P remote:path rem ...
- Matlab高级教程_第一篇:Matlab基础知识提炼_04
第八节:几大MATLAB的数据类型 8.1 数值型 8.2 字符和字符串 创建用' ' 8.3 函数句柄 8.4 结构体 创建用. 语法:struct('field', var1,'field2',' ...
- MACOSX下查看某个端口被哪个程序占用及杀进程方法
sudo lsof -i :9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 61342 a 313u IPv6 0x11111 ...
- SQL服务器攻击总结-注入
查库选择convert(int,db_name())sysobjects 查当前表id,从sysobjects中选择id,xtype ='u'//此处要记录下数据库的id syscolumns查表对应 ...
- 让debian8.8不休眠,debian设置不休眠模式,因为我的本本休眠了时间不准确了,得重新同步
第一步:sudo vi /etc/systemd/logind.conf /*最好备份下再修改*/ 把下面的参数改为ignoreHandleLidSwitch=ignore 第二步: sudo ser ...