题目链接


\(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]&nle;
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(构造)的更多相关文章

  1. Codeforces 566E - Restoring Map(bitset 优化构造)

    Codeforces 题目传送门 & 洛谷题目传送门 本来说好的不做,结果今早又忍不住开了道题/qiao 我们称度为 \(1\) 的点为叶节点,度大于 \(1\) 的点为非叶节点. 首先考虑如 ...

  2. @codefoces - 566E@ Restoring Map

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 对于一棵 n 个点的树,我们称两个点是相邻的当且仅当两个点的距离 ...

  3. codeforces 651C(map、去重)

    题目链接:http://codeforces.com/contest/651/problem/C 思路:结果就是计算同一横坐标.纵坐标上有多少点,再减去可能重复的数量(用map,pair存一下就OK了 ...

  4. Codeforces Gym 100531I Instruction 构造

    Problem I. Instruction 题目连接: http://codeforces.com/gym/100531/attachments Description Ingrid is a he ...

  5. [ An Ac a Day ^_^ ] CodeForces 468A 24 Game 构造

    题意是让你用1到n的数构造24 看完题解感觉被样例骗了…… 很明显 n<4肯定不行 然后构造出来4 5的组成24的式子 把大于4(偶数)或者5(奇数)的数构造成i-(i-1)=1 之后就是无尽的 ...

  6. Codeforces 947F. Public Service 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF947F.html 近5K码量构造题,CF血腥残暴! 题解 这里先定义 $FT(k)$ 表示一个菊花树多 k ...

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

  8. CodeForces 404C Restore Graph (构造)

    题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离. 析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int...找了好久 ...

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

随机推荐

  1. 乘法原理,加法原理,多重集的排列数(多个系列操作穿插的排列数) 进阶指南 洛谷p4778

    https://www.luogu.org/problemnew/solution/P4778 非常好的题目,囊括了乘法加法原理和多重集合排列,虽然最后使用一个结论解出来的.. 给定一个n的排列,用最 ...

  2. mac 显示/不显示"任何来源"_ mac打开安装文件显示文件破损解决办法

    系统: macOS_10.12 导致文件破损原因: 软件有经过了汉化或者破解,所以可能被Mac认为「已损坏」 解决问题办法: 系统偏好设置 -> 安全性与隐私 -> 通用 -> 选择 ...

  3. 读书笔记——《You Don't Know JS》

    第一部:<You don't know JS: this & Object prototype> 第三章 Object 对象常量 var myObject = {}; Object ...

  4. 回到未来123Back To The Future

    或许,决定着现在的过去已经无法改变,但决定着未来的现在,却在我们每个人的手里. 路?我们要去的地方不需要路.(Roads? Where we're going we don't need roads) ...

  5. 金蝶开k3wise客户端访问中间层不时提示远程服务器不存在或不可用

    此问题一般是发生在WIN7客户端+中间层为WIN2008 R2系统,一般是中间层启用guest引起: a. 从Windows Vista以后, Negotiate (http://msdn.micro ...

  6. Linux使用退格键时出现^H ^?解决方法

    Linux使用退格键时出现^H ^?解决方法 在linux下执行脚本不注意输错内容需要删除时总是出现^H ^H不是H键的意思,是backspace.主要是当你的终端backspace有问题的时候才需要 ...

  7. Git基础(四) 查看已暂存和未暂存的修改

    比较工作目录中当前文件和暂存区域快照之间的差异(也就是修改之后还没有暂存起来的变化内容) git diff 比较已暂存的将要添加到下次提交里的内容 git diff --cached Git 1.6. ...

  8. webpack学习笔记--配置devServer

    devServer 1-6 使用DevServer 介绍过用来提高开发效率的 DevServer ,它提供了一些配置项可以改变 DevServer 的默认行为. 要配置 DevServer ,除了在配 ...

  9. JavaScript数组去重的6个方法

    方法一无需思考,我们可以得到 O(n^2) 复杂度的解法.定义一个变量数组 res 保存结果,遍历需要去重的数组,如果该元素已经存在在 res 中了,则说明是重复的元素,如果没有,则放入 res 中. ...

  10. [POI2007]堆积木Klo

    题解: dp定义方程的时候 好像也不能都用前一个来递推..这样就不能优化了 这题看了题解才想出来... 还是很简单的啊.... 我们定义f[i]表示前i个最大收益 那么j要能从i转移就得满足a[i]- ...