题解:

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>的更多相关文章

  1. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  2. BZOJ1050 HAOI2006旅行(最小生成树+LCT)

    暴力枚举路径中权值最小边是哪个,然后求出边权不小于它的边的最小生成树,即可保证该路径上最大值最小.暴力当然可以过,这里使用LCT维护.注意数据中有自环. #include<iostream> ...

  3. 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  4. 洛谷P3366 【模板】最小生成树(LCT)

    [模板]最小生成树 题目传送门 解题思路 用LCT来维护最小生成树. 除了把各顶点作为节点外,每条边也都视为一个节点.对于要加入的边\(e\),检查其两顶点\(x\)和\(y\)是否在同一棵树中,如果 ...

  5. 5.19 省选模拟赛 小B的图 最小生成树 LCT

    LINK:小B的图 这道题就比较容易了. 容易想到将询问离线 然后 从小到大排序 那么显然是优先放正图(x+k)的边. 考虑随着x的增大 那么负图上的边会逐渐加进来 一条边被加进来当且仅当 其权值小于 ...

  6. COJ 0500 杨老师的路径规划(MST)最小生成树

    杨老师的路径规划(MST) 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 为满足同学们需求,杨老师在实验楼4层新建了好多个计算 ...

  7. 3669 [Noi2014]魔法森林(LCT,最小生成树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题意] 给定一个无向图,求1-n的路径中最小的max{ai}+max{bi} ...

  8. ☆ [NOI2014] 魔法森林 「LCT动态维护最小生成树」

    题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:带权无向图,每条边有权值\(a[i],b[i]\).要求一条从\(1\)到\(N\)的路径,使得这条路径上的\(Ma ...

  9. ☆ [WC2006] 水管局长 「LCT动态维护最小生成树」

    题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:给出一张简单无向图,要求找到两点间的一条路径,使其最长边最小.同时有删边操作 解题思路 两点间路径的最长边最小,也就 ...

随机推荐

  1. 简易selenium自动化测试框架(Python)

    最近空闲时间在探索Selenium的自动化测试,简单的写了一个小框架来测试公司的一个web产品.该框架包括以下模块: 1. Test case编写模式(page模式,参考之前的博文http://www ...

  2. C# 一般处理程序生成验证码

    using System; using System.Collections; using System.Data; using System.Linq; using System.Web; usin ...

  3. js 将很长的内容进行页面分页显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. nxlog 日志采集

    Nxlog 主要用于各业务后端服务的日志采集,windows环境和linux环境都支持. RPM 包:rpm -ivh http://nxlog.co/system/files/products/fi ...

  5. 第18月第21日 vue cnpm

    1. 首先我们需要下载npm,因为我已经提前安装了node.js,安装包里面集成了npm,然后我们就可以利用npm命令从获取淘宝镜像的cnpm了. 1.打开命令行窗口,输入 npm install - ...

  6. mysql 架构~MGR监控手段

    一 简介 今天咱们来聊聊MGR的监控 二 监控 方面: 1 节点mysql进程监控                       2 节点mysql复制进程的监控                    ...

  7. android greenDao使用

    github:https://github.com/greenrobot/greenDAO 基本使用:https://toutiao.io/posts/yg1kyu/preview https://b ...

  8. ubuntu14.04 安装Kdevelop 进行ROS开发

    1. 安装gcc sudo apt-get build-dep gcc sudo apt-get install build-essential  2. 安装Kdevelop sudo apt-get ...

  9. API 开发平台 dreamfactory,参考SAWAGGER,国外厂家,开源,本地与云部署

    API 开发平台,参考SAWAGGER,国外厂家,本地与云部署:参考  http://swagger.io/commercial-tools/ 1.dreamfactory 梦工厂公司  https: ...

  10. shell script中read的用法

    1.read基本读取 #!/bin/bash #testing the read command echo -n "Enter you name:" #echo -n 让用户直接在 ...