[洛谷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 ...
随机推荐
- c语言中命令行参数argc,argv[]详解
main(int argc,char *argv[ ]) 1.argc为整数 2.argv为指针的指针(可理解为:char **argv or: char *argv[] or: char argv[ ...
- NGINX常用模块(二)
5.Nginx日志配置 Nginx有非常灵活的日志记录模式.每个级别的配置可以有各自独立的访问日志.日志格式 通过log_format命令定义格式 1.log_format指令 # 配置语法:包括:e ...
- 蓝桥杯2015-省赛-C/C++-A组2题 星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标.每个炸弹都可以设定多少天之后爆炸.比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸.有一个贝塔 ...
- 1. 模块化的引入与导出 (commonJS规范 和ES6规范)
node组件导出模块 node一般用commonJS规范 可以通过module.exports导出自己写的模块 这样其他的js文件就可以引用并使用这个模块 module.exports = { log ...
- 小白学习之pytorch框架(5)-多层感知机(MLP)-(tensor、variable、计算图、ReLU()、sigmoid()、tanh())
先记录一下一开始学习torch时未曾记录(也未好好弄懂哈)导致又忘记了的tensor.variable.计算图 计算图 计算图直白的来说,就是数学公式(也叫模型)用图表示,这个图即计算图.借用 htt ...
- CSS知识点小结
在网页排版布局中比如文章列表标题排版,无论多少文字均不希望换行显示,需要强制在一行显示完内容.这就可以nobr标签来实现. 一.nobr语法 <nobr>内容</nobr> 不 ...
- XSL使用写法与效果
data.xml <?xml-stylesheet type="text/xsl" href="getdata.xsl"?> <ROOT> ...
- Python语言学习:homework1
'''购物车程序1.启动程序后,让用户输入工资,然后打印商品列表2.允许用户根据商品编号购买商品3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4.可随时退出,退出时,打印已购买商品和余额 ...
- python常见内置函数总结
简单的内置函数 len 求长度 min 求最小值 max 求最大值 sorted 排序 reversed 反向 sum 求和 进制转换 bin 转为二进制 oct 转为八 ...
- vue中过滤器filter
Vue.js 允许我们自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值表达式. v-bind表达式.过滤器应该被添加在 JavaScript 表达式的尾部,由 ...