NOI2014 魔法森林

IP白名单校验 支持格式: 1、127.0.0.1 // 指定固定IP 2、127.0.0.1-127.0.0.128 // 可使用“-”来表示一个IP区间,支持跨IP段(一般不会出现这种情况,跨IP段则配置多个规则) 3、127.0.* // 2~4位IP段可... 阅读详情

Description

为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M。初始时小E同学在号节点1,隐士则住在号节点N。小E需要通过这一片魔法森林,才能够拜访到隐士。
魔法森林中居住了一些妖怪。每当有人经过一条边的时候,这条边上的妖怪就会对其发起攻击。幸运的是,在号节点住着两种守护精灵:A型守护精灵与B型守护精灵。小E可以借助它们的力量,达到自己的目的。
只要小E带上足够多的守护精灵,妖怪们就不会发起攻击了。具体来说,无向图中的每一条边Ei包含两个权值Ai与Bi。若身上携带的A型守护精灵个数不少于Ai,且B型守护精灵个数不少于Bi,这条边上的妖怪就不会对通过这条边的人发起攻击。当且仅当通过这片魔法森林的过程中没有任意一条边的妖怪向小E发起攻击,他才能成功找到隐士。
由于携带守护精灵是一件非常麻烦的事,小E想要知道,要能够成功拜访到隐士,最少需要携带守护精灵的总个数。守护精灵的总个数为A型守护精灵的个数与B型守护精灵的个数之和。

Input

第1行包含两个整数N,M,表示无向图共有N个节点,M条边。 接下来M行,第行包含4个正整数Xi,Yi,Ai,Bi,描述第i条无向边。其中Xi与Yi为该边两个端点的标号,Ai与Bi的含义如题所述。 注意数据中可能包含重边与自环。

Output

输出一行一个整数:如果小E可以成功拜访到隐士,输出小E最少需要携带的守护精灵的总个数;如果无论如何小E都无法拜访到隐士,输出“-1”(不含引号)。

Sample Input

【输入样例1】

4 5

1 2 19 1

2 3 8 12

2 4 12 15

1 3 17 8

3 4 1 17

【输入样例2】

3 1

1 2 1 1

Sample Output

【输出样例1】

32

【样例说明1】 如果小E走路径1→2→4,需要携带19+15=34个守护精灵; 如果小E走路径1→3→4,需要携带17+17=34个守护精灵; 如果小E走路径1→2→3→4,需要携带19+17=36个守护精灵; 如果小E走路径1→3→2→4,需要携带17+15=32个守护精灵。 综上所述,小E最少需要携带32个守护精灵。

【输出样例2】

-1

【样例说明2】 小E无法从1号节点到达3号节点,故输出-1。

题目大意:给定一些边权(a,b),求使1~n连通的所有边中max(a)+max(b)最小。

LCT维护最小生成树,有几个有趣而且很有用的思想(小技巧),据说spfa可过而且吊打lct,思想类似。

1、LCT不好维护边权,采用夹点维护点权

2、有两个变量a和b,采取固定一维使其单调,枚举另一维。

做法:

以a为关键字排序。

枚举每一条边,记录所有边中最大的一条的位置。

如果a[i].x和a[i].y连通:

1)若v[maxp]>a[i].b,删除原路径x->y最大边,加入这条边

2)否则,继续不用管

如果a[i].x和a[i].y不连通,直接加进去。

因为边权为正数,所以x->y肯定是简单路径,因此,加入不相关的x,y对于1->n没有影响。

#include<bits/stdc++.h>
using namespace std;
#define Inc(i,L,r) for(register int i=(L);i<=(r);++i)
const int N = 150010;
struct Edge{
	int x,y,a,b;
	bool operator <(const Edge&A)const{return a<A.a;}
}a[N];
struct Splay{
	bool rev[N];
	int p[N],ch[N][2];
	int vl[N],maxp[N];//最大值位置 
	#define Ls(v) ch[v][0]
	#define rs(v) ch[v][1]
	inline bool is_root(int x){
		return (Ls(p[x])^x)&&(rs(p[x])^x);
	}
	inline void pushdown(int x){
		if(rev[x]){
			rev[Ls(x)]^=1,rev[rs(x)]^=1;
			swap(Ls(x),rs(x));
			rev[x]=0;
		}
	}
	inline void maintain(int x){
		maxp[x]=x;//没有负数 
		if(vl[maxp[Ls(x)]]>vl[maxp[x]])maxp[x]=maxp[Ls(x)];
		if(vl[maxp[rs(x)]]>vl[maxp[x]])maxp[x]=maxp[rs(x)];
	}
	inline void rot(int x){
		int f=p[x],gf=p[f],type=rs(f)==x,son=ch[x][!type];
		if(!is_root(f))ch[gf][rs(gf)==f]=x;p[x]=gf;
		ch[p[son]=f][type]=son,maintain(f);
		ch[p[f]=x][!type]=f,maintain(x);
	}
	int top,stk[N];
	inline void splay(int x){
		stk[++top]=x;
		if(!is_root(x))for(int i=x;i;i=p[i])stk[++top]=p[i];
		while(top)pushdown(stk[top--]);
		while(!is_root(x)){
			if(is_root(p[x]))return rot(x),void();
			if((rs(p[p[x]])==p[x])==(rs(p[x])==x))rot(p[x]);
			rot(x);
		}
	}
	inline int findrt(int x){
		while(Ls(x))x=Ls(x);
		return x;
	}
};
struct LCT{
	Splay sp;
	inline void access(int x){
		for(int lastx=0;x;lastx=x,x=sp.p[x])
			sp.splay(x),sp.rs(x)=lastx,sp.maintain(x);
	}
	inline void make_root(int x){
		access(x),sp.splay(x),sp.rev[x]^=1;
	}
	inline void link(int x,int y){
		make_root(x),sp.p[x]=y;
	}
	inline void split(int x,int y){
		make_root(x),access(y),sp.splay(y);
	}
	inline void cut(int x,int y){
		split(x,y);
		sp.p[x]=sp.Ls(y)=0;
	}
	inline bool connect(int x,int y){
		int rtx,rty;
		access(x),sp.splay(x);rtx=sp.findrt(x);
		access(y),sp.splay(y);rty=sp.findrt(y);
		return rtx==rty;
	}
	inline int findmaxp(int x,int y){
		return split(x,y),sp.maxp[y];
	}
}lct;
int n,m,ans;
inline void init(){
	scanf("%d%d",&n,&m);
	Inc(i,1,m){
		int x,y,A,b;scanf("%d%d%d%d",&x,&y,&A,&b);
		a[i]=(Edge){x,y,A,b};
	}
	sort(a+1,a+1+m);
	ans=0x3f3f3f3f;
}
inline void solv(){
	Inc(i,1,m){
		int x=a[i].x,y=a[i].y;
		if(lct.connect(x,y)){
			int maxp=lct.findmaxp(x,y);
			if(lct.sp.vl[maxp]>a[i].b){
				lct.cut(a[maxp-n].x,maxp),lct.cut(maxp,a[maxp-n].y);//断原来的边,不是断x,y 
				lct.sp.vl[n+i]=a[i].b;
				lct.link(x,i+n),lct.link(i+n,y);
			}
		}else {
			lct.sp.vl[n+i]=a[i].b;
			lct.link(x,i+n),lct.link(i+n,y);
		}
		if(lct.connect(1,n))ans=min(ans,a[i].a+lct.sp.vl[lct.findmaxp(1,n)]);
	}
	cout<<(ans==0x3f3f3f3f?-1:ans)<<"\n";
}
int main(){
	init();
	solv();
	return 0;
}

 

构建基于知识图谱的金融监管合规系统 金融行业是一个高度监管的领域,金融机构需要遵守众多复杂的法规和政策。传统的金融监管合规方式往往依赖于人工审查和简单的规则引擎,效率低下且容易出错。构建基于知识图谱的金融监管合规系统的目的在于利用知识图谱强大的知识表示和推理能力,实现对金融业务数据的自动化分析和合规检查,提高监管合规的效率和准确性。本系统的范围涵盖了金融机构的各类业务,如银行业务、证券业务、保险业务等。 阅读详情

相关推荐

AI+Xmind自动生成测试用例(思维导图格式)

最后:我是Walker,一个热爱分享编程知识的程序员,希望能够帮助到你!

Think_and_work的博客 2332

【NOI 2014】魔法森林

算法标签:LCT维护最小生成树中最大的边

forever_dreams的博客 466

Charles 抓包工具下载安装及基础使用

本篇内容主讲关于Charles抓包工具,从下载安装以及配置信息,证书的下载安装以及PC端设置代理配置和移动端设备配置代理,阐述关于Charles抓包工具面板的基础使用以及如何进行抓包和设置断点,对于软件测试以及对抓包感兴趣的读者可以翻阅!感谢大家的支持!!!

灵魂学者的博客 2957

[NOI2014]魔法森林

一、题目 点此看题 二、解法 有一个明显的思路,就是对于每一个aaa的取值,我们找到最小的bbb,用它们去更新答案。 具体来说,先把边按aaa从小到大排序,然后对于当前的aaa,就把它当做最大的aaa,现在我们要让最大的bbb最小,这不就是最小生成树吗,只是我们要动态维护,剩下的就变成了这道题,贴上代码: #include <cstdio> #include <iostream&...

C202044zxy的博客 303

Tessent --- PDL

当关联的ICL模块是当前ICL顶部模块时,即当它与当前设计匹配时,只能iCall一个iTopProc。但是,可以在iTopProc内调用iCall iProc或iTopProc。为指定后续iProc命令引用的ICL模块,发出这个命令之后,随后定义的iProc都会对应的ICL模块进行定义。为后续iCall调用,当使用iCall命令调用该过程时,参数列表中的变量将被替换为iCall命令中指定的值。在调用iProc时,运行iProc内的命令。PDL是面向工程师的,工程师利用PDL语言,对ICL中的单元进行控制。

qiantianyiqian的博客 2783

JasperReport制作行内容合并的表格

效果图: 实现思路一: 交叉表 另一个思路: 普通表格 缺点:无法实现内容 垂直居中显示 准备工作 一、数据准备 DROP TABLE IF EXISTS `address_item_sex_value`; CREATE TABLE `address_item_sex_value` ( `id` int(11) NOT NULL AUTO_INCREM...

weixin_34148456的博客 2468

【NOI2014】魔法森林

【NOI2014】魔法森林 【题目描述】 小H最近在研究随机算法。随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性。事实上,随机数生成函数也并不是真正的“随机”,其一般都是利用某个算法计算得来的。比如,下面这个二次多项式递推算法就是一个常用算法:算法选定非负整数 x0,a,b,c,d 作为随机种子,并采用如下递推公式进行计算:

OI技术宅 2519

Polyworks脚本开发学习笔记(一)-脚本开发环境

详细的总结和记录了利用Polyworks进行脚本开发的一些方法和心得

qq_43662503的博客 6800

【BZOJ】【P3669】【NOI2014】【魔法森林】【题解】【LCT】

传送门:www.lydsy.com:808/JudgeOnline/problem.php?id=3669 考场上弱……写了40分……

退役狗的专栏 2729

看懂特斯拉IMU底层逻辑,才懂农业机器人不可替代的核心技术壁垒

在自动驾驶与具身智能赛道,特斯拉彻底重构了IMU(惯性测量单元)的技术定位,打破行业“IMU仅为辅助补盲配件”的固有认知,将其从底盘附属硬件升级为纯视觉感知体系的物理核心基座。依托500–1000Hz超高刷新率、无外部依赖的惯性感知能力、端到端神经网络融合架构,特斯拉实现了“视觉感知环境、IMU定义运动”的技术闭环,摆脱对激光雷达、高精地图、卫星定位的强依赖。这套技术逻辑落地农业机器人赛道,不再是技术优化,而是规模化落地的生存刚需。城市自动驾驶属于结构化稳定场景,IMU仅作误差修正的锦上添花;

getusushu的博客 49

汽车标定技术(七)--英飞凌TC3xx_Overlay实现页切换

今天说要开个专栏讲讲XCP标定,但在将标定之前,先把英飞凌专门为标定功能设计overlay功能讲解清楚。

认真搞搞汽车MCU 4015

[NOI2014]魔法森林(动态加边+SPFA)

【题解】 求两个变量构成的最优值,可以考虑限制一个变量,最优化另一个  观察此题,可以得到这样一个思路: 假设已知答案中的Ai的最大值不超过x,只需最小化1到n路径上的Bi的最大值  不难想到二分这个Ai的上限x 更新方式为SPFA,即,设d[i]为:只考虑Ai 然而这样的话,对于每个x,d数组都要重新求  不如我们按Ai从小到大加边,随着加边来更新 BiMax 的最小值,这样d[i

cjk_My steps 2984

基于STM32单片机设计的红外测温仪(带人脸检测)_34

当前设计的这款红外非接触式测温仪由测温硬件+上位机软件组合而成,主要用在地铁、车站入口等地方,可以准确识别人脸进行测温,如果有人温度超标会进行语音提示并且保存当前人脸照片。

8769

#3. 【NOI2014】魔法森林

#3. 【NOI2014】魔法森林序言题目描述解析 序言 UOJUOJUOJ果然是神仙OJOJOJ啊 里面个个都是人才,说话还好听 题目的hackhackhack数据还可以hackhackhack掉网上一大片的题解… 题目描述 为了得到书法大家的真传,小EEE同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个NNN节点MMM条边的无向图,节点标号为1…n1…n1…n,边标号为1…...

rp++ 1451

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

神spfa [Noi2014]魔法森林

问题 G: [Noi2014]魔法森林 时间限制: 30 Sec  内存限制: 512 MB 题目描述 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M。初始时小E同学在号节点1,隐士则住在号节点N。小E需要通过这一片魔法森林,才能够拜访到隐士。 魔法森林中居住了一些妖怪。每当

蒟蒻QTY 484

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[NOI2014]魔法森林 LCT

题面 [NOI2014]魔法森林 题解 一条路径的代价为路径上的\(max(a[i]) + max(b[i])\),因为一条边同时有$a[i], b[i]$2种权值,直接处理不好同时兼顾到,所以我们考虑一个暴力的做法。 一个暴力的做法: 我们枚举\(max(a[i])\),然后强制只能选满足这个限制的边,那么此时\(a[i]\)就已经不用管了,只需要最小化\(max(b[i])\)即可。 因此我们...

weixin_30709929的博客 155

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

BZOJ 3669 NOI2014 魔法森林

3669: [Noi2014]魔法森林 Time Limit: 30 SecMemory Limit: 512 MBSubmit: 3553Solved: 2278[Submit][Status][Discuss] Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为...

173

loj2245 [NOI2014]魔法森林 LCT

[NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树。 把边拆成点就可以了。 uoj98.也许lct复杂度写假了、、越卡常,越慢 代码 #include <bits/stdc++.h> #define ls c[x][0] #define rs c[x][1] using namespace std; const int N = 2e5 + 7; int...

weixin_30312659的博客 116

P2387 [NOI2014]魔法森林

题目 P2387 [NOI2014]魔法森林 这题目花了点时间题解没图,其中一些操作不够简洁,常数比较大,都说\(LCT\)常数小(时限\(3000ms\),最大点\(500ms\)),反正过了 做法 首先考虑做法:排序\(a\),顺序加边,然后动态维护最大\(b\)(使生成树最小,其中贡献为最大的\(b\)) 这题是动态的,所以考虑\(LCT\),但不同的是维护边权,根据我们图论的技巧,把边转点...

weixin_30347009的博客 91

3669: [Noi2014]魔法森林

3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 2089  Solved: 1277 [Submit][Status][Discuss] Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1

CRZbulabula的博客 831

bzoj-3669: [Noi2014]魔法森林

3669: [Noi2014]魔法森林 Time Limit:30 SecMemory Limit:512 MB Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M。初始时小E同学在号节点1,隐士则住在号节点N。小E需要通过这一片魔法森林,...

aln1541的博客 170

bzoj 3669: [Noi2014]魔法森林

3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 1731  Solved: 1047 [Submit][Status][Discuss] Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1

clover_hxy的博客 1426

BZOJ3669: [Noi2014]魔法森林【并查集+LCT】

3669: [Noi2014]魔法森林 【题目描述】 传送门 【题解】 我们发现只要记录这条路径上的最大值就可以了,那么我们可以强制其中一个为最大值,然后判断是否联通,更新答案(也就是将a排序,然后维护1到n中b的最大值就可以了) 可以用LCT解决,考虑这个两个节点全部被加入,那么我们用这个b替换掉这条路径上最大的b,就可以了。 【代码如下】 #include&lt;cstdio&gt; #inc...

XSamsara的博客 AFO 207
上一篇: BZOJ3282 Tree
下一篇: 雅礼集训2017Day5 远行
DancingZ
博客等级 码龄9年 10粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值