存个模板,顺便复习一下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] [模板] 最小生成树的更多相关文章

  1. 最小生成树 & 洛谷P3366【模板】最小生成树 & 洛谷P2820 局域网

    嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...

  2. 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题

    链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...

  3. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  4. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  5. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  6. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

  7. 洛谷-P5357-【模板】AC自动机(二次加强版)

    题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...

  8. 洛谷.1919.[模板]A*B Problem升级版(FFT)

    题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...

  9. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

随机推荐

  1. iTOP-4418开发板TF卡烧写-引导uboot

    基于迅为iTOP-4418开发板 将 TF 卡接入开发板,将拨码开关设置为 TF 卡启动,进入 uboot 模式,如下图所示. 如下图所示,使用命令“fastboot”,接着就可以通过 OTG 给 e ...

  2. Charles 安装配置

    与Fiddler相比,Charles 对url的分类列表更为清晰,这一点是我更喜欢Charles的一点.当然在抓app包上,个人觉得使用Charles更得心应手,这一点可能仁者见仁智者见智. 下载 官 ...

  3. 1. Ruby基础知识

    1. Ruby执行选项 符号 作用 -c 检查代码正确性 -w 警告模式运行 -e 字面脚本 -l 行模式运行 单独 ruby -c Hello.rb 组合 ruby -le 'print " ...

  4. python——logging模块

    简介: 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.不同的事件,被区分在不同的等级中,故通过log分析,可以很轻易地分析 ...

  5. NWERC 2015

    2015-2016 Northwestern European Regional Contest (NWERC 2015) F H没做 似乎只有 B 题有点意思 D:数论分块枚举所有上取整区间,只需要 ...

  6. oracle 导入导出参数

  7. 小程序中map的取值和赋值

    1.初始化 resultMap: { "near": [], "join": [], "publish": [] } 2.js中直接取 co ...

  8. linux 上安装 tomcat

    准备条件:安装java 一.tomcat 的安装 #新建文件夹 mkdir -p /data/tomcat #下载 tomcat8 服务器 wget http://mirrors.tuna.tsing ...

  9. LeetCode No.106,107,108

    No.106 从中序与后序遍历序列构造二叉树 题目 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 示例 例如,给出 中序遍历 inorder = [9,3,15,2 ...

  10. topological space

    \(\underline{Def:}\)A topology space \(\mathcal{X}=(\underline{X},\eth_{x})\)consists of a set \(\un ...