最小生成树<lct>
题解:
lct动态维护最小生成树
每次加边时若这两个之间不连通,那么直接连接
如果这两个点联通,那么就找到这条边上的最大值
如果这个大于当前边,就替换掉
但是需要注意的是lct只能维护点,不能维护边
所以可以把边弄成点
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 500000
ll n,m,num,root,data[maxn],fa[maxn],
leftson[maxn],rightson[maxn];
ll v[maxn],aa[maxn],bb[maxn];
bool rev[maxn];
void down(ll x)
{
if (!rev[x]) return;
swap(leftson[x],rightson[x]); rev[x]=;
rev[leftson[x]]^=; rev[rightson[x]]^=;
}
int se(int x,int y,int z)
{
if (v[x]>=v[y]&&v[x]>=v[z]) return(x);
else if (v[y]>=v[x]&&v[y]>=v[z]) return(y);
else return(z);
}
void updata(ll x)
{
down(x);
data[x]=se(x,data[leftson[x]],data[rightson[x]]);
}
void pushr(ll x)
{
rev[x]^=;
}
bool pd(ll x)
{
ll y=fa[x];
if (leftson[y]!=x&&rightson[y]!=x) return(false);
else return(true);
}
void rotate(ll x,ll y)
{
ll father=fa[x];
if (y==)
{
rightson[father]=leftson[x];
if (leftson[x]) fa[leftson[x]]=father;
} else
{
leftson[father]=rightson[x];
if (rightson[x]) fa[rightson[x]]=father;
}
fa[x]=fa[father];
if (pd(father))
{
if (leftson[fa[father]]==father)
leftson[fa[father]]=x; else
rightson[fa[father]]=x;
}
fa[father]=x;
if (y==) leftson[x]=father; else rightson[x]=father;
updata(father); updata(x);
}
void dfs(ll x)
{
if (pd(x)) dfs(fa[x]);
down(x);
}
void splay(ll x)
{
dfs(x);
ll father=fa[x];
while (pd(x))
{
if (!pd(father))
{
if (x==leftson[father]) rotate(x,);
else rotate(x,);
} else
{
if (father==leftson[fa[father]])
{
if (x==leftson[father])
rotate(father,),rotate(x,);
else rotate(x,),rotate(x,);
} else
{
if (x==rightson[father])
rotate(father,),rotate(x,);
else rotate(x,),rotate(x,);
}
}
father=fa[x];
}
}
void access(ll x)
{
for (ll y=;x;y=x,x=fa[x])
splay(x),rightson[x]=y,updata(x);
}
void makeroot(ll x)
{
access(x);
splay(x);
pushr(x);
}
ll findroot(ll x)
{
access(x);
splay(x);
while (leftson[x]) x=leftson[x];
return x;
}
void split(ll x,ll y)
{
makeroot(x);
access(y);
splay(y);
}
void link(ll x,ll y)
{
makeroot(x);
if (findroot(y)!=x) fa[x]=y;
}
void cut(ll x,ll y)
{
makeroot(x);
split(x,y);
fa[x]=leftson[y]=;
}
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
cin>>n>>m;
int c,d,e;
int cnt=,num=;
for (int i=;i<=m;i++)
{
cin>>c>>d>>e;
makeroot(c);
if (findroot(d)==c)
{
split(c,d);
int d1=data[d];
if (v[d1]>e)
{
cut(aa[d1],d1); cut(bb[d1],d1); num-=(v[d1]-e);
link(c,i+n); link(i+n,d); v[i+n]=e;
aa[i+n]=c; bb[i+n]=d;
}
} else
{
cnt++; link(c,i+n); link(i+n,d); v[i+n]=e;
aa[i+n]=c; bb[i+n]=d; num+=e;
}
}
cout<<num;
return ;
}
最小生成树<lct>的更多相关文章
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- BZOJ1050 HAOI2006旅行(最小生成树+LCT)
暴力枚举路径中权值最小边是哪个,然后求出边权不小于它的边的最小生成树,即可保证该路径上最大值最小.暴力当然可以过,这里使用LCT维护.注意数据中有自环. #include<iostream> ...
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- 洛谷P3366 【模板】最小生成树(LCT)
[模板]最小生成树 题目传送门 解题思路 用LCT来维护最小生成树. 除了把各顶点作为节点外,每条边也都视为一个节点.对于要加入的边\(e\),检查其两顶点\(x\)和\(y\)是否在同一棵树中,如果 ...
- 5.19 省选模拟赛 小B的图 最小生成树 LCT
LINK:小B的图 这道题就比较容易了. 容易想到将询问离线 然后 从小到大排序 那么显然是优先放正图(x+k)的边. 考虑随着x的增大 那么负图上的边会逐渐加进来 一条边被加进来当且仅当 其权值小于 ...
- COJ 0500 杨老师的路径规划(MST)最小生成树
杨老师的路径规划(MST) 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 为满足同学们需求,杨老师在实验楼4层新建了好多个计算 ...
- 3669 [Noi2014]魔法森林(LCT,最小生成树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题意] 给定一个无向图,求1-n的路径中最小的max{ai}+max{bi} ...
- ☆ [NOI2014] 魔法森林 「LCT动态维护最小生成树」
题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:带权无向图,每条边有权值\(a[i],b[i]\).要求一条从\(1\)到\(N\)的路径,使得这条路径上的\(Ma ...
- ☆ [WC2006] 水管局长 「LCT动态维护最小生成树」
题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:给出一张简单无向图,要求找到两点间的一条路径,使其最长边最小.同时有删边操作 解题思路 两点间路径的最长边最小,也就 ...
随机推荐
- Tomcat8.5配置https启动报空指针错误
tomcat8.5版本和tomcat8.0有了很大的区别,默认的server.xml中https的配置方式也有了变化: <Connector port="8443" prot ...
- JS——页面倒计时跳转
Js几秒后倒计时跳转 <html><head><title>出错啦~~~</title><link href="css/login1.c ...
- 整数数字调节框QSpinBox
样式: import sys from PyQt5.QtWidgets import QApplication, QWidget, QSpinBox, QDoubleSpinBox, QHBoxLay ...
- mysql 查询优化 ~explain解读之select_type的解读
一 简介:今天咱们来聊聊explain的select_type 二 类型 (1)SIMPLE 简单的SELECT语句(不包括UNION操作或子查询操作) (2)PRIMARY/UNION PRIMAR ...
- Struts防止表单重复提交
1.什么是表单重复提交 > 在不刷新表单页面的前提下: >> 多次点击提交按钮 >> 已经提交成功, 按 "回退" 之后 ...
- Freemarker list 的简单使用
freemarker list (长度,遍历,下标,嵌套,排序) 1. freemarker获取list的size : Java ArrayList<String> list = new ...
- spring源码学习1
1.下载源码: https://github.com/spring-projects/spring-framework中找到链接: git clone https://github.com/sprin ...
- 简述JavaScript全局对象
全局对象是JavaScript中非常重要的一类对象,它作为程序顶层(程序最顶端,不包括在任何函数之内)的上下文存在,JavaScript中的全局属性.全局函数都是通过全局对象来提供给程序的,比如 全局 ...
- RNN(3) ------ “blog:RNN学习之路”
博客链接:http://blog.csdn.net/yangyangyang20092010/article/details/50374289 Recurrent Neural Network 学习之 ...
- Libevent源码分析—event_base_dispatch()
我们知道libevent是一个Reactor模式的事件驱动的网络库. 到目前为止,我们已经看了核心的event和event_base结构体的源码,看了初始化这两个结构体的源码,看了注册event的 ...