将边按a排序,一条条加入,若当前的x,y未联通则直接加入这条边,

否则看当前边的b是否小于x,y,路径上最大的b,小于则拆掉该边,加入当前边。

显然可以用lct维护,splay维护b的最大值

把边拆成点权为b的点,点则是点权为0

Cut时找到改点,splay到根,切掉左右儿子

Link时加入新点,把x,y newroot,虚父亲指向新点

//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
#include<cmath>
const int N=200000+7;
typedef long long LL;
using namespace std;template<typename T> void read(T &x) {char ch=getchar(); x=0; T f=1;while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}int n,m,ecnt;
struct edge{int x,y,a,b;edge(){}edge(int x,int y,int a,int b):x(x),y(y),a(a),b(b){} friend bool operator <(const edge&A,const edge&B) {return A.a<B.a||(A.a==B.a&&A.b<B.b);}
}e[N];int tot,ch[N][2],p[N],v[N],bb[N],flip[N];
#define lc ch[x][0]
#define rc ch[x][1]
void update(int x) {v[x]=max(max(bb[x],v[lc]),v[rc]);}int isroot(int x) {return (ch[p[x]][0]!=x&&ch[p[x]][1]!=x);}void down(int x) {if(!flip[x]) return;swap(lc,rc); flip[lc]^=1;flip[rc]^=1;flip[x]^=1;
}void rotate(int x) {int y=p[x],z=p[y],l=(x==ch[y][1]),r=l^1;if(!isroot(y)) ch[z][y==ch[z][1]]=x; p[x]=z;ch[y][l]=ch[x][r]; p[ch[x][r]]=y;ch[x][r]=y; p[y]=x;update(y); update(x);
}void splay(int x) {static int g[N],top=0,tp;for(tp=x;!isroot(tp);tp=p[tp]) g[++top]=tp;g[++top]=tp;while(top) down(g[top--]);for(;!isroot(x);rotate(x)) {int y=p[x],z=p[y];if(!isroot(y))((x==ch[y][1])^(y==ch[z][1]))?rotate(x):rotate(y); }
}void access(int x) {for(int t=0;x;x=p[t=x]) {splay(x);ch[x][1]=t;update(x);}
}int findroot(int x) {access(x);splay(x);while(lc) x=lc;return x;
}int newroot(int x) {access(x);splay(x);flip[x]^=1;
}int qry(int x,int y) {newroot(x);access(y);splay(y);return v[y];
} void lik(int x,int y,int w) {int z=++tot;bb[z]=v[z]=w;newroot(x);p[x]=z;newroot(y);p[y]=z;
}int find(int x,int y) {if(bb[x]==y) return x;if(v[lc]==y) return find(lc,y);else return find(rc,y);
}int cut(int x) {splay(x);p[ch[x][0]]=0;p[ch[x][1]]=0;
}void work() {int ans=1e9+7;sort(e+1,e+m+1);for(int i=1;i<=m;i++) {int u=e[i].x,v=e[i].y,a=e[i].a,b=e[i].b;if(findroot(u)!=findroot(v)) lik(u,v,b);else {int tp=qry(u,v);if(b<tp) {int tpp=find(v,tp);cut(tpp);lik(u,v,b);}}if(findroot(1)==findroot(n)) {int tp=qry(1,n);ans=min(ans,a+tp);}} if(ans==1e9+7) ans=-1;printf("%d\n",ans);
}void init() {read(n); read(m);tot=n;for(int i=1;i<=m;i++) {int x,y,a,b;read(x); read(y); read(a); read(b);if(x!=y) e[++ecnt]=edge(x,y,a,b); }m=ecnt;
}int main() {
#ifdef DEBUGfreopen(".in","r",stdin);freopen(".out","w",stdout);
#endifinit();work();return 0;
}
/*
4 5
1 2 19 1
2 3 8 12
2 4 12 15
1 3 17 8
3 4 1 173 1
1 2 1 1
*/

View Code

转载于:https://www.cnblogs.com/Achenchen/p/8021442.html

bzoj3669(NOI2014)魔法森林相关推荐

  1. [BZOJ3669]-[Noi2014]魔法森林-LCT+并查集

    说在前面 刚刚去写了一道SPFA+网络流的糅合题,1A了 闲着没事干开始翻起了status,发现有人在做水管局长,哇这不是LCT嘛! 然后回头看了一下自己写过的寥寥无几的LCT的题,发现都快要忘了 于 ...

  2. 【bzoj3669】[Noi2014]魔法森林【LCT】

    [Noi2014]魔法森林 Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1 ...

  3. BZOJ 3669: [Noi2014]魔法森林( LCT )

    排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...

  4. [LCT动态树] [NOI2014]魔法森林,[ZJOI2018]历史

    [NOI2014] 魔法森林 题目 按照aaa精灵从小到大排序 按顺序插入每一条边 加入第iii条边后的最小代价为a[i]a[i]a[i]加上从111到nnn的所有路径中最大bbb最小的路径代价 维护 ...

  5. loj2245 [NOI2014]魔法森林 LCT

    [NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...

  6. 神spfa [Noi2014]魔法森林

    问题 G: [Noi2014]魔法森林 时间限制: 30 Sec  内存限制: 512 MB 题目描述 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个 ...

  7. 【bzoj 3669】[Noi2014]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  8. 图论 BZOJ 3669 [Noi2014]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  9. [BZOJ]3669: [Noi2014]魔法森林 lct

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  10. [NOI2014]魔法森林题解

    这道题正解其实是LCT,然而貌似SPFA也可以成功水过,所以根本不知道LCT的我只能说SPFA了. 这道题最大的限制是两种精灵就意味着一条道可能有两个权值,因此我们需要去将其中一个固定,然后再推另一个 ...

最新文章

  1. android 三维动画效果,9款令人惊叹的HTML5 3D动画应用
  2. 互联网1分钟 |1213
  3. 你可能不知道的Python面试秘籍 干货满满(附带参考答案)上篇
  4. opencv学习笔记16:梯度运算之scharr算子及其函数使用
  5. Centos-Server-Nginx服务(编译安装)
  6. 在线ajax测试,在线测试 - SosoApi,简单强大的api接口文档管理平台
  7. 云原生大数据架构中实时计算维表和结果表的选型实践
  8. 腾讯游戏与NVIDIA合作发布START云游戏服务
  9. Docker-Compose快速搭建Oracle-12C系统
  10. 做自媒体培训赚的盆满钵满
  11. 【优化算法】人工大猩猩部队优化算法(GTO)【含Matlab源码 1798期】
  12. c语言程序设计设计题题库,C语言程序设计题库.doc
  13. 磁碟机病毒专杀3月20日更新到6.4版 (另附上多种专杀工具)
  14. 前端布局篇之文字居中显示
  15. android 扫描动画效果图,RadarView之自定义雷达扫描动画效果。
  16. 数据库事务的四大特性,四种隔离级别,如何避免脏读、不可重复读、幻读(如何加锁)?
  17. 家用简单电线路图_这6张图在手,简单的家庭电路,电线还怕不会装?不存在的!...
  18. 怎样读书(繁体版)读书笔记
  19. Android开发EditText属性
  20. OpenCL编程初探

热门文章

  1. 闪退没由报错_?秉承工匠精神,3步定位飞桨报错原因,你也来试试?
  2. 冲突等价(ConflictEquivalence) 可串行化调度(Serializable Schedules)
  3. Hyperledger Fabric教程(8)--byfn.sh分析-script.sh
  4. html插一置顶图片,HTML实现置顶--火箭置顶
  5. 二十五、JAVA多线程(三、线程同步)
  6. Scala中的下划线使用总结
  7. Matter-JS Composites 混合材料 · 下
  8. Java 原生 Base64 编解码、Md5、SHA-1、SHA-256 加密摘要算法
  9. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_03-项目概述-技术架构...
  10. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-1.单机和分布式应用的登录检验讲解...