存个模板,顺便复习一下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. win10环境下pycharm成功安装torch,解决报错:from torch._C import * ImportError: DLL load failed: 找不到指定的模块

    https://blog.csdn.net/watermelon12138/article/details/97624733

  2. 实践一次有趣的sql优化

    课程表 #课程表 create table Course( c_id int PRIMARY KEY, name varchar(10) ) 增加 100 条数据 #增加课程表100条数据 DROP ...

  3. 伯特兰·亚瑟·威廉·罗素[註 1],第三代羅素伯爵(英语:Bertrand Arthur William Russell, 3rd Earl Russell,1872年5月18日-1970年2月2日),OM,FRS,英国哲学家、数学家和逻辑学家,致力于哲学的大众化、普及化。[2] 在數學哲學上採取弗雷格的邏輯主義立場,認為數學可以化約到邏輯,哲學可以像邏輯一樣形式系統化,主張逻辑原子論。[3]

    一年假. 1920年7月,罗素申請了一年假; 這被批准了.他花了一年時間在中國和日本講學.对中国学术界有相当影响. 罗素说:  对爱情的渴望,对知识的追求,对人类苦难不可遏制的同情,是支配我一生的单纯 ...

  4. 控制台输出<迷你DVD管理>

    使用顺序.选择.循环.跳转语句 数组 功能实现菜单显示和切换 输入的数字不符合要求直接退出程序 用户可以选择新增.查看. 删除.借出.归还.退出 思路分析 使用switch语句实现菜单选择 使用do- ...

  5. Python语言学习:模块

    一.模块 1. 模块(Module):以.py结尾的文件,包含python对象定义和python语句.使代码段更容易理解和使用. 模块分为两种:标准库(直接导入的库)和第三方库(需要下载安装的库). ...

  6. [WC2010]重建计划(长链剖分+线段树+分数规划)

    看到平均值一眼分数规划,二分答案mid,边权变为w[i]-mid,看是否有长度在[L,R]的正权路径.设f[i][j]表示以i为根向下j步最长路径,用长链剖分可以优化到O(1),查询答案线段树即可,复 ...

  7. ZOJ-1610 Count the Colors(线段树染色,求染色段)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 https://vjudge.net/contest/318019# ...

  8. sql表变量,临时表

    @test是表变量,存在于内存中:#是临时表,存在于tempdb数据库空间.

  9. [LC] 90. Subsets II

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  10. TimeHelper

    import java.time.Duration; import java.time.Instant; import java.time.OffsetDateTime; import java.ti ...