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. 【BZOJ】1707: [Usaco2007 Nov]tanning分配防晒霜

    [算法]贪心扫描线(+堆) [题意]给定n头牛有区间[a,b],m个防晒霜值为ai,每个可以使用bi次,每次可以使包含它的区间涂到防晒霜,问最多被涂牛数. [题解] 参考:[bzoj1707]: [U ...

  2. Java读取大文件的高效率实现

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 ...

  3. 天梯赛 L2-20 功夫传人 (深搜)

    一门武功能否传承久远并被发扬光大,是要看缘分的.一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱-- 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹.挖到 ...

  4. bzoj 2653 二分答案+可持久化线段树

    首先离散化,然后我们知道如果对于一个询问的区间[l1,r1],[l2,r2],我们二分到一个答案x,将[l1,r2]区间中的元素大于等于x的设为1,其余的设为-1,那么如果[l1,r1]的最大右区间和 ...

  5. python并发编程之asyncio协程(三)

    协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈:协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快.开销更小.效率更高,在有多IO操作 ...

  6. Linux内核中的Cache段

    Linux内核中的Cache段 原文地址:http://blogold.chinaunix.net/u2/85263/showart_1743693.html 最近移植LEON3的内核时,了解了一些简 ...

  7. 不老的神器:安全扫描器Nmap渗透使用指南【转】

    介绍 nmap是用来探测计算机网络上的主机和服务的一种安全扫描器.为了绘制网络拓扑图Nmap的发送特制的数据包到目标主机然后对返回数据包进行分析.Nmap是一款枚举和测试网络的强大工具. 特点 主机探 ...

  8. 2017 NEERC

    2017 NEERC Problem A. Archery Tournament 题目描述:在二维平面上,会陆续出现一些圆,以及一些询问,询问点是否在圆内,如果是,则输出那个圆,并把那个圆删掉,否则输 ...

  9. curl错误码77 及 升级libcurl

    今天碰到一个问题,curl请求返回错误码77错误  还给出了官网地址,网上查到77对应的是CURLE_SSL_CACERT_BADFILE   想起了刚默认更新了libcurl,于是有手工安装了一下c ...

  10. 虚拟机NAT网络设置

    1. 虚拟机设置 2. 本地网络设置 3. 本地虚拟网卡设置 4. 安装虚拟机,设置网络为NAT方式即可访问外网.