Codeforces 1103 C. Johnny Solving
Codeforces 1103 C. Johnny Solving
题目大意:
有一张 \(n\) 个点 \(m\) 条边的简单无向图,每个点的度数至少为 \(3\) ,你需要构造出两种情况之一
一条长度至少为 \(\frac{n}{k}\) 的简单路径
\(k\) 个大小大于 \(3\) 且不为 \(3\) 的倍数的简单环,且满足每个环中至少有一个点只属于这个环。
如果都构造不出来则输出 \(-1\) 。
解题思路:
首先必定可以构造出来,\(-1\) 就是用来迷惑你的。
从无向图生成树的角度考虑,如果生成树的最大深度至少为 \(\frac{n}{k}\) ,那么直接输出简单路径,否则可以证明生成树一定有至少 \(k+1\) 个叶子。
假设叶子数量小于 \(k+1\) ,每一个叶子的深度最大为 \(\frac{n}{k}-1\),由于所有叶子到根的路径的并是这棵树,所以所有叶子的深度之和要大于 \(n\) ,矛盾。
事实上每一个叶子都可以构造出一个长度不为 \(3\) 的倍数的简单环,由于每个点度数 $\geq 3 $ ,那么每个叶子至少存在两条反祖边,假设叶子 \(u\) 对应的这两个祖先分别为 \(x, y\) 。
如果其中一个祖先满足 \(dep[x] \bmod 3 \neq 0\) ,那么 \(u\) 到这祖先就能形成一个合法环。
否则两个祖先都满足 \(\bmod 3 = 0\) 那么 \(x-y\) 之间的路径再加上 \(u\) 就能形成一个 \(\bmod 3 = 1\) 的合法环。
考虑每一个环都包含一个叶子,这个叶子显然满足在所有环里只出现一次。
code
/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf ((ll)(1e17))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 1000005;
pair<int, int> q[N];
vector<int> g[N], leaf;
int vis[N], dep[N], dd[N], ms[N], fa[N], n, m, k;
inline void dfs(int u){
vis[u] = 1, dep[u] = 1; int tot = 0;
for(int i = 0; i < (int) g[u].size(); i++){
int v = g[u][i];-
if(v == fa[u]) continue;
if(!vis[v]){
fa[v] = u, dd[v] = dd[u] + 1, dfs(v);
if(dep[v] >= dep[u])
dep[u] = dep[v] + 1, ms[u] = v;
tot++;
}
else{
if(!q[u].first) q[u].first = v;
else if(!q[u].second) q[u].second = v;
}
}
if(!tot) leaf.push_back(u);
}
inline void outpath(int u){
printf("%d ", u);
if(ms[u]) outpath(ms[u]);
}
inline void gao(int x, int y){
if(dd[x] < dd[y]) swap(x, y);
while(x != y) printf("%d ", x), x = fa[x];
printf("%d ", y);
}
int main(){
read(n), read(m), read(k);
for(int i = 1, x, y; i <= m; i++){
read(x), read(y);
g[x].push_back(y), g[y].push_back(x);
}
dfs(1);
if(dep[1] >= n / k){
puts("PATH");
cout << dep[1] << endl;
return outpath(1), 0;
}
puts("CYCLES");
for(int i = 0; i < k; i++){
int u = leaf[i];
int x = q[u].first, y = q[u].second;
if((dd[u] - dd[x] + 1) % 3 != 0)
printf("%d\n", dd[u] - dd[x] + 1), gao(u, x), puts("");
else if((dd[u] - dd[y] + 1) % 3 != 0)
printf("%d\n", dd[u] - dd[y] + 1), gao(u, y), puts("");
else printf("%d\n", abs(dd[x] - dd[y]) + 2), gao(x, y), printf("%d\n", u);
}
}
Codeforces 1103 C. Johnny Solving的更多相关文章
- CF1103C Johnny Solving (Codeforces Round #534 (Div. 1)) 思维+构造
题目传送门 https://codeforces.com/contest/1103/problem/C 题解 这个题还算一个有难度的不错的题目吧. 题目给出了两种回答方式: 找出一条长度 \(\geq ...
- Johnny Solving CodeForces - 1103C (构造,图论)
大意: 无向图, 无重边自环, 每个点度数>=3, 要求完成下面任意一个任务 找一条结点数不少于n/k的简单路径 找k个简单环, 每个环结点数小于n/k, 且不为3的倍数, 且每个环有一个特殊点 ...
- CodeForces 1103C. Johnny Solving
题目简述:给定简单(无自环.无重边)连通无向图$G = (V, E), 1 \leq n = |V| \leq 2.5 \times 10^5, 1 \leq m = |E| \leq 5 \time ...
- Codeforces 1103 E. Radix sum
题目链接 神题. 题意:给定一个长度为\(10^5\)的幂级数\(a\),将卷积的下标运算定义为十进制下的不进位加法,求\(a^k\)模\(2^{58}\)的结果.\(k\leq 10^9\). 题解 ...
- Codeforces 1103 简要题解(持续更新)
文章目录 A题 B题 C题 D题 传送门 又一场原地爆炸的比赛. A题 传送门 简单思维题 题意:给一个4∗44*44∗4的格子图和一个01串,你要根据01串放1∗21*21∗2的木块,如果是0就竖放 ...
- Codeforces Round #534 (Div. 2)
B. Game with string 题意: 给出一个字符串s只包括小写字母.当轮到一个玩家的时候,他可以选择两个连续且相等的字母并且删除它.当一个玩家没得删的时候他就输了. 题解: 乍一看有点懵, ...
- Codeforces Round #534 (Div. 2) Solution
A. Splitting into digits Solved. #include <bits/stdc++.h> using namespace std; int n; void sol ...
- 20191028 Codeforces Round #534 (Div. 1) - Virtual Participation
菜是原罪. 英语不好更是原罪. \(\mathrm{A - Grid game}\) 题解 \(4 \times 4\) 的格子,两种放法. 发现这两种在一起时候很讨厌,于是强行拆分这个格子 上面 \ ...
- Solution -「构造」专练
记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...
随机推荐
- [php]几个常用函数
count(arr);用于统计数组的元素个数 is_array(arr);判断给定变量是不是数组 var_dump(var||arr);打印数组或变量信息(类型和值): print_r(var||ar ...
- C++面试中可能考察的基础知识(1)
1 C++中允许函数的嵌套调用,但不允许函数的嵌套定义 2 构建派生类对象时,先调用基类的构造函数,在调用成员对象的构造函数,最后调用派生类构造函数. 3 volatile关键字 volatile提醒 ...
- CF 900B
CF 900B Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Descript ...
- MyBatis笔记之配置输出日志并打印输出SQL语句
1. 引入Log4J的Maven依赖: <dependency> <groupId>log4j</groupId> <artifactId>log4j& ...
- JavaScript三种绑定事件的方式
JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> // ...
- Android中注册获取验证码倒计时按钮
public class CountDownTimerUtils extends CountDownTimer { private TextView mTextView; /** * @param t ...
- 深入理解C指针----学习笔记
深入理解C指针 第1章 认识指针 理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址. 1.1 指针和内存 C程序在编译后,以三种方式使用内存: 1. 静态. ...
- defer用途
package main /* defer :程序退出时执行,先进后执行 defer庸碌: 1.关闭文件句柄 2.锁资源释放 3.数据库连接释放 */ import ( "fmt" ...
- PHY Linux 驱动
以太网 MAC(链路层)+PHY(物理层/RTL8201F,88E1111);集成型DM9000,RTL8139CP 由于网络数据传输量较大,不论是分开型还是集成型,通常会在MAC和PHY之间引入DM ...
- photoshop 安装问题
问题:“安装程序检测到计算机重新启动操作可能处于挂起状态.建议您退出安装程序,重新启动并重试.” 解决: 1.运行 regedit 打开注册表编辑器. 2.依次展开HKEY_LOCAL_MACHINE ...