存个模板,顺便复习一下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. python学习笔记_集合的定义和常用方法

    1.认识集合 定义: s={1,2,3,4,5} s=set("hello") s=set(["steven","job","da ...

  2. sklearn 缺失值填补(总结)

    首先查看数据形态: data.shape 再查看数据类型和非空值的个数与比例 data.info() 使用SimpleImputer进行填补 from sklearn.impute import Si ...

  3. Java远程调用Linux脚本

    参考:http://blog.csdn.net/xiao_jun_0820/article/details/26254813  http://blog.csdn.net/a19881029/artic ...

  4. MySQL--事务控制和锁定语句

    MySQL 支持对 MyISAM 和 MEMORY 存储引擎的表进行表级锁定,对 BDB 存储引擎的表进行页级锁定,对 InnoDB 存储引擎的表进行行级锁定.默认情况下,表锁和行锁都是自动获得的,不 ...

  5. LeetCode No.154,155,156

    No.154 FindMin 寻找旋转排序数组中的最小值 II 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7 ...

  6. Java之异常的处理(try-catch)

    import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java. ...

  7. Java多线程常见概念

    进程和线程的区别 进程是资源分配的最小单位,线程是CPU调度的最小单位 线程不能看做独立应用,而进程可以 进程有独立的地址空间,互相不影响,线程只是进程的不同执行路径 线程没有独立的地址空间,多进程的 ...

  8. Notes_STL_List_And_Map

    //Description: 使用STL遇到的问题 //Create Date: 2019-07-08 09:19:15 //Author: channy Notes_STL_List_And_Map ...

  9. 2)#ifndef和#pragma once

    #################################################################################################### ...

  10. LeetCode No.124,125,126

    No.124 MaxPathSum 二叉树中的最大路径和 题目 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定 ...