按a从小到大排序,然后按b建图。

每次只需要找1~n中最大的b加当前的a计算答案即可。

这里还有一个小操作就是化边为点,把一条边的边权看做一个点的点权然后多连两条边。

By:大奕哥

 #include<bits/stdc++.h>
using namespace std;
const int N=4e5+;
int fa[N],ma[N],pos[N],c[N][],rev[N],s[N],n,m,ans=2e9,w[N];
struct node{
int x,y,a,b;
bool operator <(const node &b)const{
return a<b.a;
}
}a[N];
bool isroot(int x){return c[fa[x]][]!=x&&c[fa[x]][]!=x;}
void pushup(int x)
{
if(rev[x])
{
rev[x]^=;rev[c[x][]]^=;rev[c[x][]]^=;
swap(c[x][],c[x][]);
}
return;
}
void update(int x)
{
ma[x]=w[x];pos[x]=x;
if(ma[c[x][]]>ma[x])ma[x]=ma[c[x][]],pos[x]=pos[c[x][]];
if(ma[c[x][]]>ma[x])ma[x]=ma[c[x][]],pos[x]=pos[c[x][]];
return;
}
void rotate(int x)
{
int y=fa[x],z=fa[y],l,r;
l=c[y][]==x;r=l^;
if(!isroot(y))c[z][c[z][]==y]=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
update(y);update(x);
}
void splay(int x)
{
int top=,i;
for(i=x;!isroot(i);i=fa[i])s[++top]=i;s[++top]=i;
for(;top;top--)pushup(s[top]);
while(!isroot(x))
{
int y=fa[x],z=fa[y];
if(!isroot(y))
{
if(c[y][]==x^c[z][]==y)rotate(x);
else rotate(y);
}
rotate(x);
}
return;
}
void access(int x)
{
int y=;
while(x)
{
splay(x);
c[x][]=y;
y=x;x=fa[x];
}
}
void mroot(int x)
{
access(x);splay(x);rev[x]^=;
}
void link(int x,int y)
{
mroot(x);fa[x]=y;splay(x);
}
void cut(int x,int y)
{
mroot(x);access(y);splay(y);c[y][]=fa[x]=;
}
int get(int x)
{
access(x);splay(x);while(c[x][])x=c[x][];return x;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;++i)
{
scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].a,&a[i].b);
}
sort(a+,a++m);
for(int i=;i<=m;++i)
{
w[i+n]=a[i].b;
}
for(int i=;i<=m;++i)
{
if(a[i].x==a[i].y)continue;
int fx=get(a[i].x),fy=get(a[i].y);
if(fx!=fy)
{
link(a[i].x,i+n);link(i+n,a[i].y);
}
else
{
mroot(a[i].x);access(a[i].y);
splay(a[i].y);int tmp=pos[c[a[i].y][]];
if(w[tmp]>a[i].b)
{
cut(tmp,a[tmp-n].x);cut(tmp,a[tmp-n].y);
link(a[i].x,n+i);link(a[i].y,n+i);
}
}
if(get()==get(n))
{
mroot();
access(n);
splay(n);
ans=min(ans,a[i].a+ma[c[n][]]);
}
}
if(ans!=2e9)
printf("%d\n",ans);
else puts("-1");
return ;
}

BZOJ3669 NOI2014魔法森林的更多相关文章

  1. bzoj3669: [Noi2014]魔法森林 lct版

    先上题目 bzoj3669: [Noi2014]魔法森林 这道题首先每一条边都有一个a,b 我们按a从小到大排序 每次将一条路劲入队 当然这道题权在边上 所以我们将边化为点去连接他的两个端点 当然某两 ...

  2. [bzoj3669][Noi2014]魔法森林_LCT_并查集

    魔法森林 bzoj-3669 Noi-2014 题目大意:说不明白题意系列++……题目链接 注释:略. 想法:如果只有1个参量的话spfa.dij什么的都上来了. 两个参量的话我们考虑,想将所有的边按 ...

  3. BZOJ3669[Noi2014]魔法森林——kruskal+LCT

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

  4. BZOJ3669 [Noi2014]魔法森林(SPFA+动态加边)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. BZOJ3669: [Noi2014]魔法森林(瓶颈生成树 LCT)

    Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 3558  Solved: 2283[Submit][Status][Discuss] Descript ...

  6. [bzoj3669][Noi2014]魔法森林——lct

    Brief description 给定一个无向图,求从1到n的一条路径使得这条路径上最大的a和b最小. Algorithm Design 以下内容选自某HN神犇的blog 双瓶颈的最小生成树的感觉, ...

  7. bzoj3669[Noi2014]魔法森林

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  8. bzoj3669: [Noi2014]魔法森林 lct

    记得去年模拟赛的时候好像YY出二分答案枚举a,b的暴力,过了55欸 然后看正解,为了将两维变成一维,将a排序,模拟Kruskal的加边过程,同时维护1到n的最大值,加入一条边e(u,v,a,b)时有以 ...

  9. 沉迷Link-Cut tree无法自拔之:[BZOJ3669][Noi2014] 魔法森林

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 有一个很好的做法是 \(spfa\) ,但是我们不聊 \(spfa\) , 来聊 \(LCT\) \(L ...

随机推荐

  1. 【BZOJ】2099: [Usaco2010 Dec]Letter 恐吓信

    [题意]给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000. [算法]后缀自动机 || 后缀数组 [题解]对串S建SAM,然后在上 ...

  2. NSPredicate--谓词(is)

    技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong NSPredicate 技术博客http:// ...

  3. 重载jquery on方法实现click事件在移动端的快速响应

    额,这个标题取的还真是挺装的... 其实我想表达的是jquery click事件如何在移动端自动转换成touchstart事件. 因为移动端click事件会比touchstart事件慢几拍 移动设备某 ...

  4. SVM问题再理解与分析——我的角度

    SVM问题再理解与分析--我的角度 欢迎关注我的博客:http://www.cnblogs.com/xujianqing/ 支持向量机问题 问题先按照几何间隔最大化的原则引出他的问题为 上面的约束条件 ...

  5. Power Profiles for Android

    http://source.android.com/devices/tech/power.html Battery usage information is derived from battery ...

  6. UNDO自我理解总结

    [场景] 当在更新数据的时候,发现更新的值写错了,这时就需要将已经更新的地方恢复到原始数据. [基本概念] 在更新的过程中,Oracle会将原始的数据都放入到UNDO里,这样当以上情况发生后,就可以从 ...

  7. C语言实现int转换string

    #include <stdio.h> #include <stdlib.h> #include <string.h> int string2int(const ch ...

  8. C语言地址对齐(转)--网络编程之结构体大小的计算

    什么是地址对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数 ...

  9. python 内置函数eval()、exec()、compile()

    eval 函数的作用: 计算指定表达式的值.也就是说它要执行的python代码只能是单个表达式,而不是复杂的代码逻辑.    eval(source, globals=None, locals=Non ...

  10. python-unittest学习

    在说unittest之前,先说几个概念: TestCase 也就是测试用例 TestSuite 多个测试用例集合在一起,就是TestSuite TestLoader是用来加载TestCase到Test ...