BZOJ3669 NOI2014魔法森林
按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魔法森林的更多相关文章
- bzoj3669: [Noi2014]魔法森林 lct版
先上题目 bzoj3669: [Noi2014]魔法森林 这道题首先每一条边都有一个a,b 我们按a从小到大排序 每次将一条路劲入队 当然这道题权在边上 所以我们将边化为点去连接他的两个端点 当然某两 ...
- [bzoj3669][Noi2014]魔法森林_LCT_并查集
魔法森林 bzoj-3669 Noi-2014 题目大意:说不明白题意系列++……题目链接 注释:略. 想法:如果只有1个参量的话spfa.dij什么的都上来了. 两个参量的话我们考虑,想将所有的边按 ...
- BZOJ3669[Noi2014]魔法森林——kruskal+LCT
题目描述 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节点1,隐士则住 ...
- BZOJ3669 [Noi2014]魔法森林(SPFA+动态加边)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ3669: [Noi2014]魔法森林(瓶颈生成树 LCT)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 3558 Solved: 2283[Submit][Status][Discuss] Descript ...
- [bzoj3669][Noi2014]魔法森林——lct
Brief description 给定一个无向图,求从1到n的一条路径使得这条路径上最大的a和b最小. Algorithm Design 以下内容选自某HN神犇的blog 双瓶颈的最小生成树的感觉, ...
- bzoj3669[Noi2014]魔法森林
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- bzoj3669: [Noi2014]魔法森林 lct
记得去年模拟赛的时候好像YY出二分答案枚举a,b的暴力,过了55欸 然后看正解,为了将两维变成一维,将a排序,模拟Kruskal的加边过程,同时维护1到n的最大值,加入一条边e(u,v,a,b)时有以 ...
- 沉迷Link-Cut tree无法自拔之:[BZOJ3669][Noi2014] 魔法森林
来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 有一个很好的做法是 \(spfa\) ,但是我们不聊 \(spfa\) , 来聊 \(LCT\) \(L ...
随机推荐
- 【洛谷 P4437】 [HNOI/AHOI2018]排列(贪心,堆)
题目链接 如果\(j<=k,a_{p[j]}!=p[k]\)可以理解为如果\(a_{p[j]}=p[k]\),那么\(k\)一定要放在\(j\)前面,也就是\(a_j\)在\(j\)前面. 于是 ...
- scrapy 爬虫踩过的坑(I)
问题1:正则表达式没问题,但是爬虫进不了item方法 分析: 1. 可能是下载不到list 页面的内容.可以用 scrapy shell url 进行测试 2. 可能是allowed_domains ...
- 南邮综合题writeup
http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/index.php fuckjs直接console得到地址 http: ...
- SQL 变量 条件查询 插入数据
(本文只是总结网络上的教程) 在操作数据库时 SQL语句中难免会用到变量 比如 在條件值已知的情況下 INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值 ...
- SQLite3数据库的操作
数据库的操作 我们在这个项目中使用的是SQLITE3数据库软件. 通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中. 打开数据 ...
- MySQL删除数据几种情况以及是否释放磁盘空间【转】
MySQL删除数据几种情况以及是否释放磁盘空间: 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2.truncate table tabl ...
- bootstrap table 双击可编辑,添加、删除行
html: <table class="table table-bordered" id="para_table"> <tr> < ...
- 在C#中用MediaInfo获取视频或音频的属性
MediaInfo是一个开源的获取视频或音频的信息的非常便利的工具,它本身就带有一个GUI界面,可以非常方便我们查看视频信息.但是,当我们写一些转码程序时,往往需要在程序中获取视频信息的时候. 以前我 ...
- 修改 firefox accesskey 的快捷键
Chrome中,如果设置了 accesskey 的话,可以通过 Alt + 快捷键 来之直接跳转的.但在Firefox 中,可能是为了防止于菜单的快捷键冲突,所以设置了 Shift + Alt + 快 ...
- 大数据系列之分布式数据库HBase-0.9.8安装及增删改查实践
若查看HBase-1.2.4版本内容及demo代码详见 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践 1. 环境准备: 1.需要在Hadoop启动正常情况下安 ...