BZOJ 3060 Kruskal

思路:

把from&to都>k的直接加边

剩下的如果是一棵树就加.

否则ans++

(我的代码写的是反着的 不过意思都一样)

//By SiriusRen
#include <cstdio>
using namespace std;
#define N 2000005
int n,m,k,f[N],cnt;
struct Node{int from,to;}node[N];
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;i++)scanf("%d%d",&node[i].from,&node[i].to);
    for(int i=1;i<=n;i++)f[i]=i;
    for(int i=1;i<=m;i++){
        if(node[i].from>k&&node[i].to>k){
            int fx=find(node[i].from),fy=find(node[i].to);
            if(fx!=fy)f[fx]=fy;
            cnt++;
        }
    }
    for(int i=1;i<=m;i++){
        if(node[i].from<=k||node[i].to<=k){
            int fx=find(node[i].from),fy=find(node[i].to);
            if(fx!=fy)f[fx]=fy,cnt++;
        }
    }printf("%d\n",m-cnt);
}
时间: 2024-08-26 00:20:12

BZOJ 3060 Kruskal的相关文章

【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树

这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,Lca只是他的一种应用,他可以搞各种树上问题,树上倍增一般都会用到f数组. |||.我们跑出来dfs序就能在他的上面进行主席树了. IV.别忘了离散. V.他可能不连通,我一开始想到了,但是我觉得出题人可能会是好(S)人(B),但是...... #include <cstdio> #include

【BZOJ 3732】 Network Kruskal重构树+倍增LCA

Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT #include<cstdio> #include<cstring> #include<algorithm> #define for1(i,a,n) for(int i=(a);i<=(n);i++) #define for2(i,a,n) for(int i=(a

BZOJ 2594: [Wc2006]水管局长数据加强版(kruskal + LCT)

Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径,接着通过信息化的控制中心通知路径上的水管进入准备送水状态,等到路径上每一条水管都准备好了,供水公司就可以开始送水了.嘟嘟一次只能处理一项送水任务,等到当前的送水任务完成了,才能处理下一项. 在处理每项送水任务之前,路径上的水管都要进行一系列的准备操作,如清洗.消毒等等.嘟嘟在

BZOJ 1821 JSOI2010 部落划分 Group Kruskal

题目大意:给定平面上的n个点,要求将这n个点划分为k个集合,使划分后任意两个集合中最近两点的距离的最大值最小,输出这个最小值 考虑这n个点之间所有的连边 我们要让长边保留 就尽量选取短边链接 于是就是求加入n-k条边的最小生成森林 由于输出下一个最小值 因此Kruskal加入第n-k+1条边时输出边权即可 #include <cmath> #include <cstdio> #include <cstring> #include <iomanip> #inc

bzoj 3551 [ONTAK2010]Peaks加强版(kruskal,主席树,dfs序)

Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来Q行,每行三个数v x k,表示一组询问.v=v xor lastans,x=x xor lastans,k=k xor lastans.如果lastans=-1则不变. Output 同3545 [思路] Kruskal+主席树+dfs序 一个叫kruskal重构树的方法QWQ.在kruskal合

【最小树形图(奇怪的kruskal)】【SCOI 2012】【bzoj 2753】滑雪与时间胶囊

2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB Submit: 1621 Solved: 570 Description a180285非常喜欢滑雪. 他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同一时候也是景点).并且每一个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其它滑雪爱好者不同,a1

BZOJ 1016 JSOI2008 最小生成树计数 Kruskal

题目大意:给定一个无向图,求最小生成树的方案数 首先对于一个无向图的最小生成树,每种边权的边的数量是一定的 首先我们先跑一遍Kruskal,求出最小生成树上每种边权的出现次数 然后对于每种出现在最小生成树上的边权,我们从小到大处理 对于每种边权,我们枚举这种边权的边有多少种方案可以加进最小生成树上而不形成环 这个用状压处理 ans乘上这个值 然后把这种边权连接的所有联通块缩点 注意最小生成树不存在时输出0 #include<map> #include<cstdio> #includ

BZOJ 1196 HNOI2006 公路修建问题 二分答案+Kruskal

题目大意:给定一个无向图,一条边可以被建为一级公路或二级公路,要求一级公路的数量不小于k条,求最小生成树 最小生成树保证的是最大边最小 直接对边排序,然后二分答案,每次用Kruskal验证 先连一级边看能不能连出k条,再连剩余的边看看能不能得到最小生成树 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 10100 using nam

BZOJ 3732 Network Kruskal重构树

题目大意:给定一个n个点m条边的无向连通图,k次询问两点之间所有路径中最长边的最小值 Kruskal+倍增LCA做法见http://blog.csdn.net/popoqqq/article/details/39755703 LCT做法见http://blog.csdn.net/popoqqq/article/details/39929277 Kruskal重构树真是强大--一不小心手滑就RANK1啥的-- 每加入一条边时,我们并不链接这条边的两端点,而是把这条边两端点所在并查集的根连接起来,而