Luogu P6830 [IOI2020]Connecting Supertrees
题意
好复杂,我就不写了。
题解
口胡了一下,发现我居然会 IOI 的题?
首先发现有 \(3\) 一定不合法,因为连通块里面有一个环的话 \(p_{i,j}\) 最多为 \(2\),有两个环的话就存在一个 \(p_{i,j}\) 为 \(4\) 了。
所以每一个连通块之内要么是树要么是基环树。
考虑某个连通块。将这个连通块划分成若干子树,有一个环每个子树的根节点连接起来,比如说下面的图就将它划分为 \(\{1,2,3\},\{4,5,6\},\{7,8,9\}\) 三棵子树。

对于在同一个连通块里面的点 \(i,j\) 来说,如果两个点在一个子树中那么 \(p_{i,j}\) 显然为 \(1\),否则 \(p_{i,j}=2\)。
所以我们可以先将 \(p_{i,j}=1\) 的那些点合并成子树,再随意指定一个根将所有 \(p_{i,j}=2\) 的点连成一个环就做完了,这个可以用两个并查集来维护。
这题无解有点难判。
代码
#include<bits/stdc++.h>
#include "supertrees.h"
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=2e3+51;
vector<vector<ll>>res,g,p;
ll n;
ll ffa[MAXN],ffa2[MAXN];
inline ll find(ll x)
{
return x==ffa[x]?x:ffa[x]=find(ffa[x]);
}
inline ll find2(ll x)
{
return x==ffa2[x]?x:ffa2[x]=find(ffa2[x]);
}
inline void connect(ll x,ll y)
{
return (void)(res[x][y]=res[y][x]=1);
}
inline ll merge(ll x,ll y)
{
ll fx=find(x),fy=find(y);
if(fx==fy)
{
return 1;
}
for(register int i=0;i<n;i++)
{
if(p[x][i]!=p[y][i])
{
return 0;
}
}
return connect(fx,fy),ffa[fy]=fx,1;
}
inline void merge2(ll x,ll y)
{
ll fx=find2(x),fy=find2(y);
if(fx!=fy)
{
ffa2[fy]=fx;
}
}
ll construct(vector<vector<ll>>x)
{
p=x,n=p.size(),res.resize(n),g.resize(n);
for(register int i=0;i<n;i++)
{
ffa[i]=ffa2[i]=i,res[i].resize(n);
}
for(register int i=0;i<n;i++)
{
for(register int j=0;j<n;j++)
{
if(p[i][j]>2)
{
return 0;
}
if(i!=j&&p[i][j]==1&&!merge(i,j))
{
return 0;
}
}
}
for(register int i=0;i<n;i++)
{
for(register int j=0;j<n;j++)
{
find(i)==i&&find(j)==j&&p[i][j]==2?merge2(i,j):(void)1;
}
}
for(register int i=0;i<n;i++)
{
for(register int j=0;j<n;j++)
{
if(i!=j&&find(i)==i&&find(j)==j&&find2(i)==find2(j)&&!p[i][j])
{
return 0;
}
}
}
for(register int i=0;i<n;i++)
{
find(i)!=i?connect(i,ffa[i]):g[find2(i)].emplace_back(i);
}
for(register int i=0;i<n;i++)
{
if(find2(i)==i&&g[i].size()==2)
{
return 0;
}
if(find2(i)==i&&g[i].size()>1)
{
for(register int j=0;j<g[i].size();j++)
{
connect(g[i][j],g[i][(j+1)%g[i].size()]);
}
}
}
return build(res),1;
}
Luogu P6830 [IOI2020]Connecting Supertrees的更多相关文章
- Error connecting to database [Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)]
参照 http://stackoverflow.com/questions/4448467/cant-connect-to-local-mysql-server-through-socket-var- ...
- 两主机搭建MySQL主从复制后,show slave status显示:Last_IO_Error: error connecting to master ……
两台主机A.B搭建mysql主从复制关系(A为master,B为slave)后,在slave上执行show slave status,结果中显示Last_IO_Error: error connect ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- [nginx] connect() failed (111: Connection refused) while connecting to upstream, client: 101.18.123.107, server: localhost,
nginx一直报错, 2016/12/02 10:23:19 [error] 1472#0: *31 connect() failed (111: Connection refused)while c ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- connect() failed (111: Connection refused) while connecting to upstream
配置好lamp后,在浏览器中运行程序后,出现上面的错误. 转自:http://www.xuejiehome.com/blread-1828.html I'm experiencing 502 gate ...
- Ipython console in Spyder stuck on “connecting to kernel”
简短地记录下,今天排除的spyder的BUG, 现象:打开Spyder时其他正常,但是Ipython console 不能正常获取到kernel,一直转圈,显示“connecting to kerne ...
- socket() failed (13: Permission denied) while connecting to upstream
/*************************************************************************** * socket() failed (13: ...
- [luogu P2170] 选学霸(并查集+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...
随机推荐
- 利用mindmaster思维导图学好Python
- three.js学习5_渲染器
THREE.WebGLRenderer WebGL Render 用WebGL渲染出你精心制作的场景 介绍 在之前的介绍中, 已经介绍过场景, 相机, 光源, 有了这些后, 就可以形成一个可观的三维展 ...
- 074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现
074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现 本文知识点:综合案例-数组移位-主方法功能3的实现 说明:因为 ...
- 01 How does C Programming work ? C语言如何工作?
where is C used ? C 语言的应用场景 C is widely used C语言被广泛应用于: For creating desktop applications 用于创建桌面应用程序 ...
- STM32F103C8T6-CubeMx串口收发程序详细设计与测试(2)——程序规划、代码编写及测试
摘要:演示程序的功能:通过中断接收串口数据,在1750us时间内没有收到新的字节的话,将收到的数据原封不动地发送出去,以测试串口的完整收发流程.对使用到的函数进行了说明,阐述了各个函数的调用顺序和调用 ...
- Python+Appium自动化测试(9)-自动选择USB用于传输文件(不依赖appium对手机页面元素进行定位)
一,问题 app自动化测试使用Android真机连接电脑时,通常会遇到两种情况: 1.测试机连接电脑会弹窗提示USB选项,选择USB用于"传输文件",有些手机不支持设置默认USB选 ...
- 多测师讲解接口测试 _postman(下)_高级讲师肖sir
关联接口 定义:上个接口返回的参数作为下一个接口的入参 1)接口1:查询出所有的州,自治区,直辖市,省(且发送请求不需要入参) 接口url地址: http://www.webxml.com.cn/We ...
- Spring Boot 系列:最新版优雅停机详解
爱生活,爱编码,本文已收录架构技术专栏关注这个喜欢分享的地方. 开源项目: 分布式监控(Gitee GVP最有价值开源项目 ):https://gitee.com/sanjiankethree/cub ...
- day26 Pyhton 面向对象复习
一 class 类名(): pass 对象 object 对象 = 类名() class Person: pass print(Person)#<class '__main__.Person'& ...
- 10年经验17张图带你进入gitflow企业项目代码版本管理的最佳实践
前言 对于项目版本管理,你是否存在这样的痛点:项目分支多而杂不好管理,git log界面commit信息错乱复杂无规范,版本回退不知道选择什么版本合适--. 项目版本管理的最佳实践系列,笔者将以两篇文 ...