Codeforces 1182D Complete Mirror 树的重心乱搞 / 树的直径 / 拓扑排序
题意:给你一颗树,问这颗树是否存在一个根,使得对于任意两点,如果它们到根的距离相同,那么它们的度必须相等。
思路1:树的重心乱搞
根据样例发现,树的重心可能是答案,所以我们可以先判断一下树的重心可不可以。如果不行,剩下的只可能是度为1点当根了。当然,我们不能枚举所有度为1的点,不然一个菊花图就超时了,我的做法是对于以重心为根的树搜索一遍,对于每个深度的度数为1的点只记录一个,然后枚举这些点,如果有就是有,否则没有。这样最坏的复杂度应该能到O(n * sqrt(n)),但是肯定跑不满。至于为什么这样做,因为感觉每个深度如果有多个点,要么随便选一个都可以,要么都不可以。没想到场上就这样过了,希望评论区有大佬的话能出个hack数据。。。
代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define db double
#define LL long long
#define pii pair<int, int>
using namespace std;
const int maxn = 100010;
vector<int> G[maxn];
void add(int x, int y) {
G[x].push_back(y);
G[y].push_back(x);
}
bool flag = 0;
bool v[maxn];
int sz[maxn], n, re[maxn];
int ans = INF, root;
map<int, int> mp;
map<int, int> ::iterator it;
void dfs(int x) {
v[x] = 1;
sz[x] = 1;
int max_part = 0;
for (auto y : G[x]) {
if(v[y]) continue;
dfs(y);
sz[x] += sz[y];
max_part = max(max_part, sz[y]);
}
max_part = max(max_part, n - sz[x]);
if(max_part < ans) {
ans = max_part;
root = x;
}
}
void dfs1(int x, int fa, int deep) {
if(re[deep] == 0) {
re[deep] = G[x].size();
} else {
if(re[deep] != G[x].size()) {
flag = 1;
// return;
}
}
sz[x] = 1;
for (auto y : G[x]) {
if(y == fa) continue;
dfs1(y, x, deep + 1);
//if(flag == 1) return;
sz[x] += sz[y];
}
if(G[x].size() == 1) {
mp[deep] = x;
}
}
bool solve() {
flag = 0;
memset(re, 0, sizeof(re));
for (auto y : G[root]) {
dfs1(y, root, 1);
}
int now = 0;
for (auto y : G[root]) {
if(now == 0) now = sz[y];
else {
if(now != sz[y]) {
flag = 1;
return flag;
}
}
}
return flag;
}
int main() {
int x, y;
scanf("%d", &n);
for (int i = 1; i < n; i++) {
scanf("%d%d", &x, &y);
add(x, y);
}
dfs(1);
if(!solve()) {
printf("%d\n", root);
return 0;
}
else {
for (it = mp.begin(); it != mp.end(); it++) {
root = it -> second;
if(!solve()) {
printf("%d\n", root);
return 0;
}
}
}
printf("-1\n");
}
思路2:(官方题解)跑一遍树的直径,先判断直径两端行不行,如果不行,从直径的中点开始,找不经过直径上的边可以到达的度数为1的点,判断行不行。
代码就咕了
思路3:(官方题解)跑一遍拓扑排序,直到只剩一个点,然后找到这个点最近的和最远的度数为1的点,判断行不行。
代码也咕了
思路2和思路3只能直观感受上好像是对的QAQ, 不会证,场上想不出来这种思路,只能乱搞水一水了QAQ 。
结合官方题解的图应该更好理解思路2和思路3:
官方题解:https://codeforces.com/blog/entry/67614
Codeforces 1182D Complete Mirror 树的重心乱搞 / 树的直径 / 拓扑排序的更多相关文章
- Codeforces 1182D Complete Mirror [树哈希]
Codeforces 中考考完之后第一个AC,纪念一下qwq 思路 简单理解一下题之后就可以发现其实就是要求一个点,使得把它提为根之后整棵树显得非常对称. 很容易想到树哈希来判结构是否相同,而且由于只 ...
- BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...
- Luogu3732 [HAOI2017] 供给侧改革 【后缀数组】【线段树】【乱搞】
题目分析: 这道题我是乱搞的,因为他说$01$串是随机的. 那么我们可以猜测能够让LCP变大的地方很少.求出后缀数组之后可能让LCP变大的地方就等价于从大到小往height里动态加点同时维护这个点左右 ...
- 2016 10 28考试 dp 乱搞 树状数组
2016 10 28 考试 时间 7:50 AM to 11:15 AM 下载链接: 试题 考试包 这次考试对自己的表现非常不满意!! T1看出来是dp题目,但是在考试过程中并没有推出转移方程,考虑了 ...
- 【CSP-S 2019】【洛谷P5666】树的重心【主席树】【树状数组】【dfs】
题目: 题目链接:https://www.luogu.com.cn/problem/P5666 小简单正在学习离散数学,今天的内容是图论基础,在课上他做了如下两条笔记: 一个大小为 \(n\) 的树由 ...
- [CSP-S模拟测试]:统计(树状数组+乱搞)
题目传送门(内部题120) 输入格式 第一行,两个正整数$n,m$. 第二行,$n$个正整数$a_1,a_2,...,a_n$,保证$1\leqslant a_i\leqslant n$,可能存在相同 ...
- Codeforces 1513F - Swapping Problem(分类讨论+乱搞)
Codeforces 题目传送门 & 洛谷题目传送门 简单题,难度 *2500 的 D2F,就当调节一下一模炸裂了的自闭的心情,稍微写写吧. 首先我看到这题的第一反应是分类讨论+数据结构,即枚 ...
- Codeforces 34C-Page Numbers(set+vector+暴力乱搞)
C. Page Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces Gym 100431D Bubble Sort 水题乱搞
原题链接:http://codeforces.com/gym/100431/attachments/download/2421/20092010-winter-petrozavodsk-camp-an ...
随机推荐
- 一、Nuget管理
一.注册账号 http://www.nuget.org 可用微软账户登录注册 手机端授权 二.打包Nuget 1.新建一个.NET Standard 的类库项目(取名类库) 更改方法 2.选择项目属性 ...
- python3 实现简单ftp服务功能(服务端 For Linux)
转载请注明出处! 功能介绍: 可执行的命令: lspwdcd put rm get mkdir 1.用户加密认证 2.允许多用户同时登陆 3.每个用户有自己的家目录,且只可以访问自己的家目录 4.运行 ...
- ThreadLocal内存泄漏
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11421437.html 内存泄漏 内存泄漏是指不再使⽤的对象⽆法得到及时的回收,持续占⽤内存空间,从⽽ ...
- linux编译php
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/loc ...
- axios拦截设置和错误处理
目前想出的处理接口请求进行全局错误提示 的最佳方案,axios整体配置如下 1.基于axiso.interceptors进行响应拦截: 主要负责全局提示错误 axios.interceptors.re ...
- imp需要
导入全部: imp user/password@10.10.10.10:1521/orcl file = C:\Users\Administrator\Desktop\20170404230000.d ...
- Vue项目中添加锁屏功能
0. 直接上 预览链接 Vue项目中添加锁屏功能 1. 实现思路 ( 1 ) 设置锁屏密码 ( 2 ) 密码存localStorage (本项目已经封装h5的sessionStorage和localS ...
- 【开源项目】一篇文章搞掂:Pig微服务框架
1.项目开发环境和运行步骤 1.1.项目开发环境 Idea:2018.1.6 Maven:3.5.3 JDK:1.8.0_172 MySQL:5.7.19(之前安装8.0.11会运行失败) Redis ...
- Angular 2 技能图谱skill-map
# Angular 2 技能图谱 ## 模块 ### 自定义模块 - 根模块 - 特性模块 - 共享模块 - 核心模块 ### 内置模块 - ApplicationModule 模块 - Common ...
- appium自动化测试- 元素操作
本文转自:https://www.cnblogs.com/sinder2018/articles/9699801.html 一.滑动屏幕 1.appium - 滑动屏幕 滑动接口: swipe(起始X ...