首页 > 其他分享 >Codeforces [Hello 2020] 1284F New Year and Social Network(图论匹配推理+lct)

Codeforces [Hello 2020] 1284F New Year and Social Network(图论匹配推理+lct)

时间:2023-05-09 18:32:35浏览次数:60  
标签:lct Network int void 1284F fa Social td define

https://codeforces.com/contest/1284/problem/F

题目大意:

有两个大小为n的树T1和T2.

T2中的每条边(u, v)可以匹配T1中u到v路径上的所有边。

求最大匹配,并给出方案。

\(1<=n<=250000\)

题解:

首先你需要观察样例大胆猜想一定有完美匹配。

考虑T1中的一个叶子x和它的父亲y。

显然的是,从T2中随便选一个端点是x的边,那个边所形成的路径一定会包含(x,y)。

也就是说在T2中选一条以x为端点的边,并且删掉这条边之后,可以将剩余连向x的边连向y,这样是等价的,目标是使新的T2也是一棵树,这样可以归纳证明有解。

显然需要选的边是x到y的路径上的第一条出边。

这样得到了一个\(O(n^2)\)的做法,考虑用lct暴力维护上面的操作,显然还是会被卡的。

不需要把x相邻的边重连到y,只需要在删除选的那条边后,给x到y连一条边。

这样可以实现到y的意思。

但是这样以后就不太好维护一条边对应的原边是什么。

所以把边也弄作点,原来的边权值是1,其它的(点或新加的边)的权值都是0,每次在x到y的路径上二分第一个权值为1的点即可。

#include<bits/stdc++.h>
#define fo(i, x, y) for(int i = x, _b = y; i <= _b; i ++)
#define ff(i, x, y) for(int i = x, _b = y; i <  _b; i ++)
#define fd(i, x, y) for(int i = x, _b = y; i >= _b; i --)
#define ll long long
#define pp printf
#define hh pp("\n")
using namespace std;

const int N = 750005;

int n, x, y;
vector<int> e1[N];
int b[N][2];

#define pb push_back
#define si size()
#define re resize

int r[N], us[N], d[N], d0;

namespace lct {
	int t[N][2], fa[N], pf[N], rev[N];
	int z[N], siz[N];
	int lr(int x) { return t[fa[x]][1] == x;}
	#define x0 t[x][0]
	#define x1 t[x][1]
	void upd(int x) {
		siz[x] = siz[x0] + siz[x1] + z[x];
	}
	void ro(int x) {
		int y = fa[x], k = lr(x);
		t[y][k] = t[x][!k]; if(t[x][!k]) fa[t[x][!k]] = y;
		fa[x] = fa[y]; if(fa[y]) t[fa[y]][lr(y)] = x;
		t[x][!k] = y, fa[y] = x, pf[x] = pf[y];
		upd(y); upd(x);
	}
	void fan(int x) {
		swap(x0, x1), rev[x] ^= 1;
	}
	void down(int x) {
		if(rev[x]) fan(x0), fan(x1), rev[x] = 0;
	}
	int d[N], d0;
	void xc(int x) {
		for(; x; x = fa[x]) d[++ d0] = x;
		while(d0) down(d[d0 --]);
	}
	void sp(int x, int y) {
		xc(x);
		for(; fa[x] != y; ro(x)) if(fa[fa[x]] != y)
			ro(lr(x) == lr(fa[x]) ? fa[x] : x);
	}
	void ac(int x) {
		for(int y = 0; x; ) {
			sp(x, 0), fa[x1] = 0, pf[x1] = x;
			x1 = y, fa[y] = x, pf[y] = 0;
			upd(x), y = x, x = pf[x];
		}
	}
	void mr(int x) {
		ac(x); sp(x, 0); fan(x);
	}
	void link(int x, int y) {
		mr(x); pf[x] = y; ac(x);
	}
	void cut(int x, int y) {
		mr(x); ac(y); sp(x, 0);
		x1 = fa[y] = pf[y] = 0;
	}
	int fl(int x) {
		down(x);
		if(siz[x0]) return fl(x0);
		return z[x] ? x : fl(x1);
	}
}

int fa[N];

void dg(int x) {
	ff(j, 0, e1[x].si) if(fa[x] != e1[x][j])
		fa[e1[x][j]] = x, dg(e1[x][j]);
}

int td;

int main() {
	scanf("%d", &n);
	td = n;
	fo(i, 1, n - 1) {
		scanf("%d %d", &x, &y);
		e1[x].pb(y); e1[y].pb(x);
	}
	fo(i, 1, n - 1) {
		scanf("%d %d", &x, &y);
		td ++;
		lct :: z[td] = lct :: siz[td] = 1;
		b[td][0] = x; b[td][1] = y;
		lct :: link(x, td);
		lct :: link(td, y);
	}
	dg(1);
	fo(i, 1, n) r[fa[i]] ++;
	fo(i, 1, n) if(!r[i]) d[++ d0] = i;
	pp("%d\n", n - 1);
	fo(i, 1, n - 1) {
		int x = d[i];
		if(!(-- r[fa[x]])) d[++ d0] = fa[x];
		lct :: mr(x);
		lct :: ac(fa[x]);
		lct :: sp(x, 0);
		int z = lct :: fl(lct :: t[x][1]);
		lct :: sp(z, 0);
		
		pp("%d %d %d %d\n", x, fa[x], b[z][0], b[z][1]);
		
		lct :: cut(b[z][0], z);
		lct :: cut(b[z][1], z);
		
		td ++;
		lct :: link(x, td);
		lct :: link(fa[x], td);
	}
}

标签:lct,Network,int,void,1284F,fa,Social,td,define
From: https://blog.51cto.com/u_16105286/6259843

相关文章

  • MBN:Mutual Boost Network for Attributed Graph Clustering
    论文阅读07-MBN:MutualBoostNetworkforAttributedGraphClustering论文信息论文地址:https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4195979代码地址:https://github.com/Xiaoqiang-Yan/MBN1.存在问题存在问题现有区分表示的方法受到节点和结构特征之间差异......
  • m车载自组织网络(Vehicular Ad-hoc Network,VANET)通信系统的matlab仿真
     1.算法仿真效果 matlab2022a仿真结果如下:         2.算法涉及理论知识概要          这里根据那个fluiddynamicmodel和stochasticmodel模型,这里使用一种如下的车辆移动模型,能够反映出车辆移动的随机性和连续性。       ......
  • network3D 交互式网络图和桑基图
    networkD3是基于D3JS的R包交互式绘图工具,用于转换R语言生成的图为交互式网页嵌套图。目前支持网络图,桑基图,树枝图等。关于网络图的绘制,我们之前有5篇文章,可点击查看。Cytoscape教程1Cytoscape之操作界面介绍新出炉的Cytoscape视频教程Cytoscape:MCODE增强包的网络模块化分析一文学......
  • 分析游戏中的金钱交易:Multi-view Attention Networks
    文章目录1.摘要2.引入3.游戏数据描述3.1逆水寒中的游戏日志3.2社交图分析3.3行为序列3.4角色属性构造4.MVAN模型4.1multi-graphattentionnetwork4.2behaviourattentionnetwork4.3behaviourattentionnetwork4.4DataSourceAttentionNetwork5.模型效果5.1baseline......
  • [Pix2Pix] Image-to-Image Translation with Conditional Adversarial NetWorks
    paper:https://arxiv.org/pdf/1611.07004.pdf[CVPR2017]code:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pixhttps://phillipi.github.io/pix2pix/[official]数据组织:需要成对图像这是加利福利亚大学在CVPR2017上发表的一篇论文,讲的是如何用条件生成对抗......
  • VeriSilicon's Vivante® Neural Network Processor (NPU) IP
    高度可扩展、可编程的计算机视觉和人工智能处理器 芯原Vivante的神经网络处理器(NPU)IP是高度可扩展、可编程的计算机视觉和人工智能处理器,支持终端、边缘端及云端设备的人工智能运算升级。VivanteNPUIP可满足多种芯片尺寸和功耗预算,是具成本效益的优质神经网络加速引擎解决......
  • Learning A Single Network for Scale-Arbitrary Super-Resolution
    LearningASingleNetworkforScale-ArbitrarySuper-Resolutionabstract现有的singleimageSR网络是为具有特定整数比例因子(例如,×2/3/4)的图像开发的,无法处理非整数和非对称SR。在本文中,作者建议从特定比例的网络中学习任意比例的图像SR网络。introduction由于上采样......
  • 论文解读《Interpolated Adversarial Training: Achieving robust neural networks wi
    论文信息论文标题:InterpolatedAdversarialTraining:Achievingrobustneuralnetworkswithoutsacrificingtoomuchaccuracy论文作者:AlexLambVikasVermaKenjiKawaguchiAlexanderMatyaskoSavyaKhoslaJuhoKannalaYoshuaBengio论文来源:2022NeuralNetworks论文地址:dow......
  • Gogs 推送 URL 被解析到默认禁用的本地网络地址(Payload URL resolved to a local netw
    原帖地址:https://blog.51cto.com/u_1472521/5981347问题配置Web钩子使用本地URL出现错误。  解决方法修改​​app.ini​​​配置文件,添加参数​​LOCAL_NETWORK_ALLOWLIST​​后重启服务。如果是多个用逗号分开,例如:LOCAL_NETWORK_ALLOWLIST=drone,192.168.20.1......
  • Handling Information Loss of Graph Neural Networks for Session-based Recommendat
    目录概符号说明存在的问题LossysessionencodingproblemIneffectivelong-rangedependencycapturingproblemLESSRS2MGS2SG模型EOPA(Edge-OrderPreservingAggregation)SGAT(ShortcutGraphAttention)叠加代码ChenT.andWongR.C.Handlinginformationlossofgrap......