Codeforces 1103 C. Johnny Solving

题目大意

有一张 \(n\) 个点 \(m\) 条边的简单无向图,每个点的度数至少为 \(3\) ,你需要构造出两种情况之一

  1. 一条长度至少为 \(\frac{n}{k}\) 的简单路径

  2. \(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的更多相关文章

  1. CF1103C Johnny Solving (Codeforces Round #534 (Div. 1)) 思维+构造

    题目传送门 https://codeforces.com/contest/1103/problem/C 题解 这个题还算一个有难度的不错的题目吧. 题目给出了两种回答方式: 找出一条长度 \(\geq ...

  2. Johnny Solving CodeForces - 1103C (构造,图论)

    大意: 无向图, 无重边自环, 每个点度数>=3, 要求完成下面任意一个任务 找一条结点数不少于n/k的简单路径 找k个简单环, 每个环结点数小于n/k, 且不为3的倍数, 且每个环有一个特殊点 ...

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

  4. Codeforces 1103 E. Radix sum

    题目链接 神题. 题意:给定一个长度为\(10^5\)的幂级数\(a\),将卷积的下标运算定义为十进制下的不进位加法,求\(a^k\)模\(2^{58}\)的结果.\(k\leq 10^9\). 题解 ...

  5. Codeforces 1103 简要题解(持续更新)

    文章目录 A题 B题 C题 D题 传送门 又一场原地爆炸的比赛. A题 传送门 简单思维题 题意:给一个4∗44*44∗4的格子图和一个01串,你要根据01串放1∗21*21∗2的木块,如果是0就竖放 ...

  6. Codeforces Round #534 (Div. 2)

    B. Game with string 题意: 给出一个字符串s只包括小写字母.当轮到一个玩家的时候,他可以选择两个连续且相等的字母并且删除它.当一个玩家没得删的时候他就输了. 题解: 乍一看有点懵, ...

  7. Codeforces Round #534 (Div. 2) Solution

    A. Splitting into digits Solved. #include <bits/stdc++.h> using namespace std; int n; void sol ...

  8. 20191028 Codeforces Round #534 (Div. 1) - Virtual Participation

    菜是原罪. 英语不好更是原罪. \(\mathrm{A - Grid game}\) 题解 \(4 \times 4\) 的格子,两种放法. 发现这两种在一起时候很讨厌,于是强行拆分这个格子 上面 \ ...

  9. Solution -「构造」专练

    记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...

随机推荐

  1. POJ2043 Area of Polygons

    Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 1020   Accepted: 407 Description Yoko's ...

  2. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)

    [题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...

  3. 【CodeForces】704 B. Ant Man

    [题目]B. Ant Man [题意]给定n个人的xi,ai,bi,ci,di,起点为s,终点为e,移动: In simpler words, jumping from i-th chair to j ...

  4. Node.js的开源博客系统Ghost搭建教程

    准备工作 Node.js版本:0.10.x.0.12.x.4.2.x.安装步骤可参考:Node.js环境搭建 Ghost版本:0.7.4:中文集成版(33.6M),中文标准版(3.39M),英文原版( ...

  5. python mysql参数化查询防sql注入

    一.写法 cursor.execute('insert into user (name,password) value (?,?)',(name,password)) 或者 cursor.execut ...

  6. SVM支持向量机的基本原理

    SVM支持向量机的基本原理 对于很多分类问题,例如最简单的,一个平面上的两类不同的点,如何将它用一条直线分开?在平面上我们可能无法实现,但是如果通过某种映射,将这些点映射到其它空间(比如说球面上等), ...

  7. 福建工程学院寒假作业第三周B题

    第二集 你说,你的女朋友就是你的电脑 TimeLimit:2000ms  MemoryLimit:128000KB 64-bit integer IO format:%lld   Problem De ...

  8. 很多人都没用过的轻量级Oracle数据库数据导出工具SQLLDR2——性能超赞

    SQLLDR2 介绍 每周发表一篇数据库或大数据相关的帖子,敬请关注 1. 工具介绍 Sqluldr2(SQL * UnLoader 第二版)是灵活与强大的 Oracle 文本导出程序,已被大众使 用 ...

  9. Oracle-AWR报告简介及如何生成【转】

    AWR报告 awr报告是oracle 10g及以上版本提供的一种性能收集和分析工具,它能提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解Oracle数据库的整个运行情况,比如硬 ...

  10. MySQL5.6 新特性之GTID【转】

    转自 MySQL5.6 新特性之GTID - jyzhou - 博客园http://www.cnblogs.com/zhoujinyi/p/4717951.html 背景: MySQL5.6在5.5的 ...