AtCoder4505 [AGC029F] Construction of a tree(二分图+网络流+dfs+构造)

problem

洛谷链接

solution

考虑 Ω={E1,...,En−1}\Omega=\{E_1,...,E_{n-1}\}Ω={E1,...,En1} 的一个子集 SSS,记 f(S)={u∣u∈Ei∈S}f(S)=\{u\mid u\in E_i\in S\}f(S)={uuEiS}

显然当 S≠∅∧∣f(S)∣≤∣S∣S\ne\empty\wedge\big|f(S)\big|\le |S|S=f(S)S 时,一定会有环存在,弄不出一棵树。

所以只有 ∣f(S)∣≥∣S∣+1\big|f(S)\big|\ge |S|+1f(S)S+1 时才有解,这是必要条件。

这十分的 Hall\text{Hall}Hall 定理长相,下面二分图的构造将说明这同时也是充分条件。

左部点集有 nnn 个点 ,右部 n−1n-1n1 个点分别表示一个点集。若 u∈Eiu\in E_iuEi,则在二分图连一条左部编号 uuu 的点到右部第 iii 个点。

有解首先要满足右部 n−1n-1n1 个点完备匹配(每个子集都要选点)。

可以用网络流 dinic\text{dinic}dinic 跑。

这样的话左部就一定会剩下一个未匹配点,记为 rtrtrt

rtrtrt 开始 dfs\text{dfs}dfs 随便找一个右部与之有边相连且还未标记过的点 iii,再找到这个点在右部的匹配点 link(i)link(i)link(i)

iii 打上标记,意味着 iii 子集选择 rt,link(i)rt,link(i)rt,link(i) 两个点。

再从 link(i)link(i)link(i) 继续 dfs\text{dfs}dfs 下去。

dfs\text{dfs}dfs 的过程中,就顺便还判断了是否有解并且记录解的选择。如果所有子集都标记了则有解。

同时,不存在将有解判为无解的可能。

dfs\text{dfs}dfs 的任何时候都是左部点访问个数 === 右部点访问个数 +1+1+1,因为只多了一个 rtrtrt

如果到了某个左部点发现右边的所有连边子集点都被打上了标记,则剩下的左部点和右部点个数就相同了。

就出现了 ∣f(S)∣≤∣S∣\big|f(S)\big|\le |S|f(S)S 的情况,就一定无解。

也就是说如果无解一定是出现了 ∣f(S)∣≤∣S∣\big|f(S)\big|\le |S|f(S)S 的情况,这也说明了这个条件是充要的。

code

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 200005
struct node { int to, nxt, flow; }E[maxn << 2];
int head[maxn], cur[maxn], dep[maxn], link[maxn];
bool vis[maxn];
int cnt = -1, s, t, n;
queue < int > q;
vector < int > ans[maxn];void addedge( int u, int v, int w ) {E[++ cnt] = { v, head[u], w }, head[u] = cnt;E[++ cnt] = { u, head[v], 0 }, head[v] = cnt;
}bool bfs() {memset( dep, 0, sizeof( dep ) );memcpy( cur, head, sizeof( head ) );dep[s] = 1; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = head[u], v;~ i;i = E[i].nxt )if( ! dep[v = E[i].to] and E[i].flow ) dep[v] = dep[u] + 1, q.push( v );}return dep[t];
}int dfs( int u, int cap ) {if( ! cap or u == t ) return cap;int flow = 0;for( int i = cur[u];~ i;i = E[i].nxt ) {cur[u] = i; int v = E[i].to;if( dep[v] == dep[u] + 1 ) {int w = dfs( v, min( cap, E[i].flow ) );if( ! w ) continue;E[i ^ 1].flow += w;E[i].flow -= w;flow += w;cap -= w;if( ! cap ) break;}}return flow;
}int dinic() {int ret = 0;while( bfs() ) ret += dfs( s, inf );return ret;
}void dfs( int u ) {cnt ++;for( int i = head[u];~ i;i = E[i].nxt ) {int v = E[i].to;if( v > n and ! vis[v] ) {ans[v].push_back( u );ans[v].push_back( link[v] );vis[v] = 1;dfs( link[v] );}}
}int main() {memset( head, -1, sizeof( head ) );scanf( "%d", &n );s = 0, t = n << 1;for( int i = 1, k, x;i < n;i ++ ) {scanf( "%d", &k );for( int j = 1;j <= k;j ++ ) {scanf( "%d", &x );addedge( x, n + i, inf );}}for( int i = 1;i <= n;i ++ ) addedge( s, i, 1 );for( int i = 1;i < n;i ++ ) addedge( i + n, t, 1 );if( dinic() != n - 1 ) return ! puts("-1");for( int i = n + 1;i < (n << 1);i ++ )for( int j = head[i];~ j;j = E[j].nxt )if( E[j].to < i and E[j].flow ) {link[i] = E[j].to;break;}int rt;for( int i = 1;i <= n;i ++ ) {for( int j = head[i];~ j;j = E[j].nxt )if( E[j].to > i and E[j ^ 1].flow ) goto pass;rt = i;break;pass :;}cnt = 0;dfs( rt );if( cnt ^ n ) return ! puts("-1");for( int i = n + 1;i < (n << 1);i ++ )printf( "%d %d\n", ans[i][0], ans[i][1] );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2447 [SDOI2010]外星千足虫

P2447 [SDOI2010]外星千足虫 题意&#xff1a; 有n个未知数 给你一个m行n1列的式子&#xff0c;对于每行&#xff0c;1到n列为这个n个未知数的系数&#xff0c;第n1列为该行式子的和mod2&#xff0c;问n个未知数是否有唯一解&#xff0c;并输出&#xff0c;并输出最少需要前k…

Kubernetes架构为什么是这样的?

小编序&#xff1a;在上周发布的《从“鸿沟理论”看云原生&#xff0c;哪些技术能够跨越鸿沟&#xff1f;》一文中&#xff0c;灵雀云CTO陈恺表示&#xff1a;Kubernetes在云计算领域已经成为既定标准&#xff0c;进入主流市场&#xff0c;最新版本主要关注在稳定性、可扩展性方…

AtCoder4380 [AGC027F] Grafting(拓扑排序)

problem 洛谷链接 solution 首先特判掉两棵树一开始就相同的情况。 那么接下来就是一定要操作才能相同的情况了。 群龙无首不行&#xff0c;我们先定根。不妨枚举第一步的叶子操作&#xff0c;即枚举叶子以及其接的点。 然后对于 A,BA,BA,B 都以这个叶子为根&#xff0c;…

开源 , KoobooJson一款高性能且轻量的JSON框架

在C#领域&#xff0c;有很多成熟的开源JSON框架&#xff0c;其中最著名且使用最多的是 Newtonsoft.Json ,然而因为版本迭代,其代码要兼容从net2.0到现在的最新的net框架,并且要支持.net平台下的其它语言,所以最新发布版本的Newtonsoft.Json其dll大小接近700k,另一方面,因为其复…

高斯消元模板

高斯消元通用 #include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std;const int MAXN50;int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool free_x[MAXN];//标记是否是不确…

[CodeForces gym 102956 D] Bank Security Unification(位运算优化dp)

problem cf链接 solution 读完题先直接暴力 dpdpdp 拿出来&#xff0c;dpimax⁡j<i{dpj(fi&fj)}dp_i\max_{j<i}\big\{dp_{j}(f_i\&f_j)\big\}dpi​maxj<i​{dpj​(fi​&fj​)}。 谁能优化谁就是爸爸 假设存在 j<k<ij<k<ij<k<i&…

P2403 [SDOI2010]所驼门王的宝藏

P2403 [SDOI2010]所驼门王的宝藏 题意&#xff1a; R * C的地图上有n个宝藏&#xff0c;给你n个宝藏的坐标&#xff0c;每个宝藏的位置上还有一个传送门&#xff0c;传送门有三种类型&#xff0c;1.可以传送到同行的其他宝藏位置&#xff0c;2.可以传送到同列的其他宝藏位置 …

分布式系统的构建原则

什么是构建一个可维护和可扩展的系统的意义&#xff1f;在早期&#xff0c;一个系统的形态&#xff0c;只是满足用户和服务器资源之间的通道&#xff0c;唯一要扩展和维护的是系统后面的资源&#xff0c;保证资源的可用和够用&#xff0c;而系统本身的压力并不大。系统设计跟我…

[HEOI2016TJOI2016]排序(二分+线段树)

problem 洛谷链接 solution 在一个丝毫没有单调性的问题中很难想到将其转化为二分。 二分最后在第 ppp 位置上的值 xxx。 然后将所有 ≥x\ge x≥x 的赋为 111&#xff0c;所有 <x<x<x 的赋为 000。 经过一系列区间排序操作后&#xff0c;最后我们只在乎第 ppp 位…

可持久化4--可持久化并查集

可持久化并查集 可持久化并查集 按秩合并并查集 可持久化数组 首先并查集不能采用路径压缩&#xff0c;这是因为一次findR操作中&#xff0c;fa数组的很多位置&#xff08;u->ru&#xff09;会发生修改&#xff0c;由于每次修改都需要在可持久化数组上复制产生log个新结…

ASP.NET Core 2.2中的Endpoint路由

在ASP.NET Core 2.2中&#xff0c;新增了一种路由&#xff0c;叫做Endpoint&#xff08;终结点&#xff09;路由。本文将以往的路由系统称为传统路由。本文通过源码的方式介绍传统路由和Endpoint路由部分核心功能和实现方法&#xff0c;具体功能上的差异见官方文档。在升级到AS…

AtCoder2063 [AGC005E] Sugigma The Showdown(博弈论)

problem 洛谷链接 solution 考虑一条 (u,v)(u,v)(u,v) 的红边&#xff0c;在蓝树上 u,vu,vu,v 两点距离 ≥3\ge 3≥3。 如果先手到达 u,vu,vu,v 其中任何一点且下一步后手行动无法抓住先手&#xff0c;那么这个游戏就将进入死循环了。 通过画图&#xff0c;你会发现这个结…

基于ASP.NET Core的模块化设计: 虚拟文件系统

土牛亲自录制的本文介绍视频Abp中文网(https://cn.abp.io/)提供翻译字幕基于ASP.NET Core的模块化设计: 虚拟文件系统简介创建模块化的应用程序很困难. 构建模块化的用户界面更加困难. 需要单独开发模块的页面和组件,但是最后要把它们集成在一起像单个UI一样创建这样的模块化架…

[SDOI2012]吊灯(结论)

problem 洛谷链接 solution 显然&#xff0c;颜色相同的灯泡形成一个连通块&#xff0c;且连通块的大小 i∣ni\mid ni∣n。 这道题要能发现一个结论&#xff1a;一定至少存在一种颜色的连通块 满足该联通块内的任意一个节点 都不是异种颜色点 的父亲。 即&#xff0c;至少…

一文带你全面认识Excel催化剂系列功能

2018年1月1日决定打造一款Excel插件&#xff0c;取名为Excel催化剂&#xff0c;历时半年的时间&#xff0c;在努力打造出和传统插件有功能差异化的基础上&#xff0c;让大家可以真正得到一些有价值非鸡肋的功能&#xff0c;对开发什么样的功能也构思了许久&#xff0c;同时对免…

可持久化汇总(讲解+题目)

可持久化(一) 可持久化(二) 可持久化3–可持久化01Trie 可持久化4–可持久化并查集 各模块的例题都在各自讲解下面有写 下面是加强练习 练习题讲解——肖然老师的博客 练习题&#xff1a; P4137 Rmq Problem / mex P4587 [FJOI2016]神秘数 CF484E Sign on Fence CF1080F Katya …

[学习笔记] 乱世之神杀疯了 —— K-D tree

文章目录K-D tree建树合并插入删除查询(估价函数)旋转坐标系题目练习[SDOI2012]最近最远点对[Violet]天使玩偶/SJY摆棋子[CQOI2016]K远点对[国家集训队]JZPFARThe closest M points简单题巧克力王国[BOI2007]Mokia 摩基亚[CH弱省胡策R2]TATT[BZOJ3815]卡常数[NOI2019]弹跳A sim…

【春华秋实】.NET Core之只是多看了你一眼

技术学习是一件系统性的事情&#xff0c;如果拒绝学习&#xff0c;那么自己就会落后以至于被替代。.NET也是一样&#xff0c;当开源、跨平台成为主流的时候&#xff0c;如果再故步自封&#xff0c;等待.NET的就是死路一条&#xff0c;幸好.NET Core问世了&#xff0c;社区反响积…

[SDOI2010]粟粟的书架

[SDOI2010]粟粟的书架 题意&#xff1a; 一个R * C的矩阵&#xff0c;每个位置都有个数page[ij]&#xff0c;现在选定一个小矩阵范围(给左上角坐标&#xff0c;和右下角坐标)&#xff0c;问这个范围内的数总和是否大于h&#xff0c;如果大于h的话最少选几个数aij 对于50%的数…

基于Asp.Net Core的简单社区项目源代码开源

2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0EF CORE 3.0开发使用vs2019 sqlserver 2017(数据库脚本最低支持sql server 2012/)使用步骤:1.下载相关开发工具2.运行数据库脚本目录下的相关脚本3.默认前端账号密码: 18812345678 1234564.默认后台账号密码: admin 123456开…