P7903 兜心の顶(构造)

news/2024/9/27 9:24:47

P7903 兜心の顶

题目背景

Source:八仙敬酒

  • 吕洞宾——醉酒提壶力千钧;
  • 铁拐李——旋肘膝撞醉还真;
  • 汉钟离——跌步抱坛兜心顶
  • 蓝采和——单提敬酒拦腰破;
  • 张果老——醉酒抛杯踢连环;
  • 曹国舅——仙人敬酒锁喉扣;
  • 韩湘子——擒腕击胸醉吹箫;
  • 何仙姑——弹腰献酒醉荡步。

题目描述

给定正整数 \(n\),要求构造一棵 \(n\) 个结点的树,满足树的直径的重心 不是 树的重心。

同时这棵树需满足:直径\(^1\)、重心\(^2\)、直径的重心\(^3\)全部唯一。


注:

  • 树的直径\(^1\):https://oi-wiki.org/graph/tree-diameter/
  • 树的重心\(^2\):https://oi-wiki.org/graph/tree-centroid/
  • 树的直径的重心\(^3\):将树的直径(一条链)视作一棵树,求其重心(一个点)。

输入格式

第一行输入一个正整数 \(n\),表示树的结点个数。

输出格式

第一行输出一个正整数 \(n\)

接下来 \(n-1\) 行,每行输出两个正整数 \(u,v\),表示树的一条边。

无解输出 -1

本题采取 Special Judge,输出任意一组合法解均给分。

样例 #1

样例输入 #1

20

样例输出 #1

20
20 18
1 3
19 12
19 4
16 1
4 1
1 7
16 10
7 20
13 8
10 2
18 13
13 17
14 18
11 19
16 5
2 6
16 9
17 15

样例 #2

样例输入 #2

2

样例输出 #2

-1

提示

样例说明

样例 #1 中直径的重心是 \(7\),树的重心是 \(1\)\(1\ne7\)

样例 #2 中 \(n=2\),只有两个点时显然重心不可能唯一。

数据范围

本题采取捆绑测试。

子任务编号 分值 特殊性质
\(1\) \(30\) \(n\le10\)
\(2\) \(30\) \(n\) 是奇数
\(3\) \(30\) \(n\) 是偶数
\(4\) \(10\)

对于 \(100\%\) 的数据:\(1\le n\le10^4\)

题目大意

构造一棵\(n\)个节点的树,使得树的直径、树的重心、树的直径的重心唯一,并且树的重心与树的直径的重心不同。

分析

我们先构造一个长链作为树的直径,

由于树的直径的重心唯一,

显然  直径应为奇数。


分情况讨论

  1. 显然  直径长度为\(1\)时不满足题意。

  2. 当直径长度为\(3\)时:

    此时,树的直径的重心为\(点2\)

    若要 “满足树的直径的重心不是树的重心” ,那么树的重心可供选取的位置为\(点1\)\(点3\)。 当然,这两个位置是等价的

    假如我们选\(点1\)

    那么为了让 \(点1\) 成为重心,我们至少要给 \(点1\) 一个节点……吗?

    细看可发现:此时树的重心有\(点1\)\(点2\)两个重心,

    所以我们至少要给\(点1\) 两个节点。

    当然,此时树的直径变为了\(4\),不满足题意。

  3. 当直径长度为\(5\)时:

    此时,树的直径的重心为\(点3\)

    那么现在树的重心可供选取的位置为\(点1\)(\(\Leftrightarrow 点5\))或\(点2\)(\(\Leftrightarrow 点4\))。
    当我们选\(点1\)时,与直径长度为\(3\)时同理。

    当我们选\(点2\)时,我们可以在此节点上增加至少两个节点(同上)使他成为树的重心。

    乂~ 多了两个直径 咋办呢?

    \(点1\)上再加一个点不就完事了嘛~

    乂~ 直径成偶数了 咋办呢?

    为了不让树的直径的重心树的重心重合,我们只能在\(点5\)再加一个节点。

最终我们得到了一个完整的大保健 一颗兜心の顶树,ta的直径为\(7\),重心为\(点2\),直径的重心为\(点3\)

综上,\(n \leq 8\)时 无解。

乂~ 那如果点数比\(8\)多 咋办呢?

其实有些熟悉毒瘤题的dalao可能已经想到了,这实际上就是一个菊花图。

\(点3\)疯狂加点不就完了嘛~

Elaina's code

Elaina's code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define Elaina 0
inline int read(){int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';return x*f;
}int n;main(){n=read();if(n<=8) return printf("-1"),Elaina;printf("%lld\n",n);printf("1 2\n");printf("2 3\n");printf("3 4\n");printf("4 5\n");printf("5 6\n");printf("6 7\n");for(int i=8;i<=n;++i){printf("3 %lld\n",i);}return Elaina;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

随记《生》——2024.5.12

水是生命,因为人一口喝下去,会充满活力。 什么是生命?随处活动着的,随处可见的,在耀眼的阳光与白天下自由自在。 你我皆无拘无束,按照自己真正所想活着即可。 ————————献给所有真正活着或者曾经真正活着的人

树的直径

树的直径 树的直径是指树上最远的两点间的距离,又称为树的最远点对。有两种方法求树的直径,时间复杂度都为 \(O(n)\):做两次 DFS(或 BFS) 树形 DP两种方法有各自的优点和缺点。 做两次 DFS(或 BFS)方法的优点是能得到完整的路径。因为它用搜索的原理,从起点 \(u\) 出发…

c语言程序实验————实验报告八

c语言程序实验————实验报告八实验项目名称: 实验报告8 字符串处理函数 实验项目类型:验证性 实验日期:2024 年 5 月 9 日一、实验目的 1.熟练掌握数组的定义格式和数组元素的表示方法; 2.熟悉数组的初始化方法和赋值方法; 3.掌握字符数组存放字符串的方法和字符串函数…

Blazor WebAssembly使用 AuthenticationStateProvider 自定义身份认证

本文章以客户端基础,实现类似后台系统,进入后台控制台页面需要经过登录身份验证才可访问情况 简单来时就是实现前后端分离,前端通过 token和用户信息进行身份认证,或者在 AuthenticationStateProvider 实现方法 GetAuthenticationStateAsync 中调用后台接口进行身份验证 安…

100274. 从魔法师身上吸取的最大能量

在神秘的地牢中,n 个魔法师站成一排。每个魔法师都拥有一个属性,这个属性可以给你提供能量。有些魔法师可能会给你负能量,即从你身上吸取能量。 你被施加了一种诅咒,当你从魔法师 i 处吸收能量后,你将被立即传送到魔法师 (i + k) 处。这一过程将重复进行,直到你到达一个不…

Lua热更学习--使用toLua中的协程

[6] C#访问调table类中的成员变量和函数 访问table中的变量和函数 lua中可以使用table作为class,因此对table中的函数访问调用是必要的根据前面对table访问和function的获取调用,这里尝试获取调用。 依然是如此,此种调用方式获取到的table中的函数是引用拷贝。 Main.lua脚本…

consul部署

下载二进制包 下载地址:https://developer.hashicorp.com/consul/install https://releases.hashicorp.com/consul/1.18.1/consul_1.18.1_linux_amd64.zip下载解压wget https://releases.hashicorp.com/consul/1.18.1/consul_1.18.1_linux_amd64.zip [root@mcw12 mcw]# ls con…