Codeforces.566E.Restoring Map(构造)
\(Description\)
对于一棵树,定义某个点的邻居集合为所有距离它不超过\(2\)的点的集合(包括它自己)。
给定\(n\)及\(n\)个点的邻居集合,要求构造一棵\(n\)个点的树,使得每个给定的集合都对应一个点。输入保证有解。
\(n\leq1000\)。
\(Solution\)
如果两个点的邻居集合大小为\(2\),那么交集中的两个点之间一定有边。这样我们就可以\(O(\frac{n^3}{w})\)确定出非叶节点以及它们之间的连边。
然后考虑叶节点应该挂到哪里。如果一个叶节点的邻居集合,和距离某个非叶节点不超过\(1\)的点的集合相同,那么这两个点之间有边。对于叶子\(x\),所有包含\(x\)的邻居集合中最小的一定就是\(x\)的邻居集合。一个点数\(\geq3\)的树,离某个点距离不超过\(1\)的点的集合是互不相同的。
需要特判非叶节点只有一个和两个的情况。
官方题解是,找出叶子\(x\)的邻居集合,如果除去\(x\)集合大小\(\geq3\),那么在集合内度数\(>1\)的点就是与\(x\)相邻的。否则集合大小是\(2\),这种情况有些难判,但是与\(x\)相邻的点一定只与一个非叶节点相连。所以我们只需要特判\(x-a-b-...\)这种情况。
还有种并查集的写法,太傻逼了看不懂了QAQ。
//296ms 100KB
#include <cstdio>
#include <cctype>
#include <bitset>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1003;
std::bitset<N> st[N],nle,adj[N];
bool not_leaf[N];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
int main()
{
int n=read();
for(int i=1; i<=n; ++i)
for(int T=read(); T--; st[i][read()]=1);
int m=0;
for(int i=1; i<=n; ++i)
for(int j=i+1; j<=n; ++j)
if((st[i]&st[j]).count()==2)
{
std::bitset<N> tmp=st[i]&st[j];
int s=0,t=0;
for(int k=1; k<=n&&!t; ++k) if(tmp[k]==1) s?t=k:s=k;//可以用_Find_next。但是暴力复杂度也是对的,暴力好咯。
if(!adj[s][t])
++m, printf("%d %d\n",s,t), nle[s]=nle[t]=1,
adj[s][s]=adj[s][t]=1, adj[t][t]=adj[t][s]=1, not_leaf[s]=not_leaf[t]=1;
}
if(!m)
{
for(int i=2; i<=n; ++i) printf("%d %d\n",1,i);
return 0;
}
if(m==1)
{
int s=0,t=0,a=0,b=0;
for(int i=1; i<=n&&!t; ++i) if(not_leaf[i]) s?t=i:s=i;
for(int i=1; i<=n; ++i)
if(st[i].count()!=n)
{
for(int j=1; j<=n; ++j) !not_leaf[j]&&printf("%d %d\n",j,st[i][j]?s:t);
break;
}
return 0;
}
for(int i=1; i<=n; ++i)
if(!not_leaf[i])
{
int mn=N,p=0;
for(int j=1; j<=n; ++j) if(st[j][i]&&st[j].count()<mn) mn=st[j].count(), p=j;
std::bitset<N> tmp=st[p]≰
for(int j=1; j<=n; ++j)
if(tmp[j]&&tmp==adj[j])
{printf("%d %d\n",i,j); break;}
}
return 0;
}
Codeforces.566E.Restoring Map(构造)的更多相关文章
- Codeforces 566E - Restoring Map(bitset 优化构造)
Codeforces 题目传送门 & 洛谷题目传送门 本来说好的不做,结果今早又忍不住开了道题/qiao 我们称度为 \(1\) 的点为叶节点,度大于 \(1\) 的点为非叶节点. 首先考虑如 ...
- @codefoces - 566E@ Restoring Map
目录 @description@ @solution@ @accepted code@ @details@ @description@ 对于一棵 n 个点的树,我们称两个点是相邻的当且仅当两个点的距离 ...
- codeforces 651C(map、去重)
题目链接:http://codeforces.com/contest/651/problem/C 思路:结果就是计算同一横坐标.纵坐标上有多少点,再减去可能重复的数量(用map,pair存一下就OK了 ...
- Codeforces Gym 100531I Instruction 构造
Problem I. Instruction 题目连接: http://codeforces.com/gym/100531/attachments Description Ingrid is a he ...
- [ An Ac a Day ^_^ ] CodeForces 468A 24 Game 构造
题意是让你用1到n的数构造24 看完题解感觉被样例骗了…… 很明显 n<4肯定不行 然后构造出来4 5的组成24的式子 把大于4(偶数)或者5(奇数)的数构造成i-(i-1)=1 之后就是无尽的 ...
- Codeforces 947F. Public Service 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF947F.html 近5K码量构造题,CF血腥残暴! 题解 这里先定义 $FT(k)$ 表示一个菊花树多 k ...
- Karen and Game CodeForces - 816C (暴力+构造)
On the way to school, Karen became fixated on the puzzle game on her phone! The game is played as fo ...
- CodeForces 404C Restore Graph (构造)
题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离. 析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int...找了好久 ...
- Vasya And The Matrix CodeForces - 1016D (思维+构造)
Now Vasya is taking an exam in mathematics. In order to get a good mark, Vasya needs to guess the ma ...
随机推荐
- PDF怎么去除页眉页脚,PDF页眉页脚编辑方法
我们在使用文件的时候需要编辑页眉页脚的时候,这个时候我们应该怎么做呢,相信别的文件大家都知道怎么编辑了,PDF文件大家都知道吗,最开始接触这个文件的时候小编觉得很难,之后找到技巧之后也并没有很难,今天 ...
- poj2817状态压缩 升维
/* 两两求出字符串之间最大可以匹配的值 由已知状态推导出位置状态 状态s表示已经加入到集合中的字符串,0表示串i不存在,1存在 由于字符串的加入顺序会影响结果,所以增加一维来表示 dp[S][i]表 ...
- Nginx详解二十二:Nginx深度学习篇之Lua解释器安装及基础语法
解释器 Lua:Lua是一个简洁.轻量.可扩展的脚本语言 Nginx+Lua优势充分的结合Nginx的并发处理epoll优势的Lua的轻量实现简单的功能切高并发的场景 安装Lua 1.安装解释器:yu ...
- python基础复习
复习-基础 一.review-base 其他语言吗和python的对比 c vs Python c语言是python的底层实现,解释器就是由python编写的. c语言开发的程序执行效率高,开发现率低 ...
- Python练习题
内置函数 # 5.随意写一个20行以上的文件# 运行程序,先将内容读到内存中,用列表存储.# 接收用户输入页码,每页5条,仅输出当页的内容 def user_check(filename,num=5) ...
- react react-transition-group实现动画
import React,{ Component,Fragment } from 'react';import './style.css';import { CSSTransition,Transit ...
- 一脸懵逼学习Hive(数据仓库基础构架)
Hive是什么?其体系结构简介*Hive的安装与管理*HiveQL数据类型,表以及表的操作*HiveQL查询数据***Hive的Java客户端** Hive的自定义函数UDF* 1:什么是Hive(一 ...
- github的pull request是指什么意思
有一个仓库,叫Repo A.你如果要往里贡献代码,首先要Fork这个Repo,于是在你的Github账号下有了一个Repo A2,.然后你在这个A2下工作,Commit,push等.然后你希望原始仓库 ...
- python linux 源码安装Twisted
下载:1.首先找到需要的包访问:https://pypi.org/在搜索框中输入你要查找的包名,然后点击搜索2.选择要下载的包的版本,点击download files3.选择file Type为sou ...
- 卸载impala
1):删除impala rm -rf $(find / -name "*impala*") 2):卸载impala相关依赖 rm -rf $(find / -name " ...