题意

好复杂,我就不写了。

题解

口胡了一下,发现我居然会 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的更多相关文章

  1. 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- ...

  2. 两主机搭建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 ...

  3. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  4. [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 ...

  5. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  6. connect() failed (111: Connection refused) while connecting to upstream

    配置好lamp后,在浏览器中运行程序后,出现上面的错误. 转自:http://www.xuejiehome.com/blread-1828.html I'm experiencing 502 gate ...

  7. Ipython console in Spyder stuck on “connecting to kernel”

    简短地记录下,今天排除的spyder的BUG, 现象:打开Spyder时其他正常,但是Ipython console 不能正常获取到kernel,一直转圈,显示“connecting to kerne ...

  8. socket() failed (13: Permission denied) while connecting to upstream

    /*************************************************************************** * socket() failed (13: ...

  9. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

随机推荐

  1. macOS提示“将对您的电脑造成伤害……“进阶版

    > 很多小伙伴在更新完系统后运行应用会闪退以及提示"xxxx 将对您的电脑造成伤害. 您应该将它移到废纸篓",本文将针对此问题提供解决方法.如图:![-w456](https ...

  2. Win10安装Ubuntu子系统

    相信我,这是最后一次折腾系统了qaq,以后一定开始认真用Linux编程 跟的一个博客安装,传送门:Win10安装Ubuntu子系统及图形化界面详细教程 文章是2019的,加上我装的是Ubuntu 20 ...

  3. 电商订单ElasticSearch同步解决方案--使用logstash

    一.使用logstash同步订单数据(订单表和订单项表)到ElasticSearch: 1.到官网下载logstash:https://www.elastic.co/cn/downloads/logs ...

  4. Python-对字典进行排序

    案例: 某班英语成绩以字典的形式存储为: {'lili':78, 'jin':50, 'liming': 30, ......} 依据成绩高低,进行学生成绩排名 如何对字典排序? 方法1: #!/us ...

  5. Arduino 语法与函数

    Arduino programs can be divided in three main parts: structure, values (variables and constants), an ...

  6. Vue自定义Popup弹窗组件|vue仿ios、微信弹窗|vue右键弹层

    基于vue.js构建的轻量级Vue移动端弹出框组件Vpopup vpopup 汇聚了有赞Vant.京东NutUI等Vue组件库的Msg消息框.Popup弹层.Dialog对话框.Toast弱提示.Ac ...

  7. 洛谷UVA524 素数环 Prime Ring Problem

    标签:搜索与回溯 题目: 从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数. 算法分析: 非常明显,这是一道回溯的题目.从1开始,每个空位有20种可能,只要填进去的数合法:与前面的数不相 ...

  8. 持续集成工具之Jenkins安装部署

    一.DevOps理念 所谓DevOps是指development和Operations的组合,中文意思就是开发和运维的简写.devops理念主要是针对企业中的研发人员.运维人员和测试人员的工作理念,是 ...

  9. centos7 安装k8s kubectl 客户端

    1. 配置k8s的kubelet 管理客户端 1 cat <<EOF > /etc/yum.repos.d/kubernetes.repo 2 [kubernetes] 3 name ...

  10. 强大的table组件-antd pro table

    概述 antd pro table antd pro table 的主要部分 表格显示的配置(绿色框内) 检索的配置(红色框内) 是否显示检索部分 检索的内容是如何生效的 工具栏的配置(黄色框内) 表 ...