CF981C Useful Decomposition【树/思维】
【链接】:CF
【题意】:给定一棵树,要求拆成若干条简单路径,并且这些路径都经过一个公共节点。给出任意一个解决方案,如不存在输出No。
【分析】:
因为是一棵树, 所以如果要求任意两条路线至少有一个公共点, 到最后, 所有的路线都会有唯一的公共点. 如果有两个公共点的话, 就至少有两条路线只包含其中的一条路线, 否则就会有环, 有了环就不是树了.
也就是说, 所有的点, 除了那个唯一的公共点, 必须度数小于 2 .
在所有点之中:
度数为 1 的点是路线的一个端点.
度数为 2 的是一条路线中除了两端以外的点.
度数大于 2 的是路线的公共点. 如果有两个及以上的点的度数是大于 2 的, 代表不可能路线中任意两条至少交于一点, 输出 No.
如果没有度数大于 2 的点, 代表只有一条路线.
如何输出路线:
先输出 Yes, 代表可以将树分解.
接着输出路线的个数, 也就是度数为 1 的点的个数.
接着, 对于每条路线, 输出其中一个度数为 1 的点和 唯一的 公共点.
注意: 如果没有度数大于 2 的点, 代表只有一条路线, 此时路线个数并不等于度数为 1 的点的个数, 并且端点就是两个度数为 1 的点.
【代码】:
#include <bits/stdc++.h>
using namespace std;
int n;
int deg[100005]; // 每个点的度数
int leaves[100005], comv[100005]; // leaves 存储度数为 1 的端点, comv 存储公共点
int nleaf = 0, ncomv = 0; // 存储度数为 1 的点与公共点的数量
int x,y;
/*
有三种可能情况:
所有链在某一点上相交,也就是只有一个点度数>2;
只有一条链,就是两个点度数为1,其他点度数为2;
不符合要求的情况,就是有超过一个点度数>2
*/
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
deg[x]++,deg[y]++;
}
for(int i=1;i<=n;i++)
{
if(deg[i]==1) leaves[++nleaf]=i;
else if(deg[i]>2) comv[++ncomv]=i;
}
//如果公共点不唯一, 就输出 "No"
if(ncomv>1) {printf("No\n");return 0;}//不符合要求的情况,就是有超过一个点度数>2
printf("Yes\n");
// 如果只有一条路线, 就输出两端 (即两个度数为 1 的点)
if(ncomv==0) printf("1\n%d %d\n",leaves[1],leaves[2]);//只有一条链,就是两个点度数为1,其他点度数为2;
else//所有链在某一点上相交,也就是只有一个点度数>2;
{
printf("%d\n",nleaf);//度数为1的点的个数
for(int i=1;i<=nleaf;i++)
{
printf("%d %d\n",comv[1],leaves[i]);//公共点与一个度数为1的点
}
}
return 0;
}
CF981C Useful Decomposition【树/思维】的更多相关文章
- CF981C Useful Decomposition 树 dfs 二十三 *
Useful Decomposition time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 【插队问题-线段树-思维巧妙】【poj2828】Buy Tickets
可耻的看了题解 巧妙的思维 逆序插入,pos 代表的意义为前面要有pos个空格才OK: 证明:仔细思考一下就觉得是正确的,但是要想到这种方式还是要很聪明,空格是前面的几个数字所形成的,所以要特地留出来 ...
- BZOJ 4552(二分+线段树+思维)
题面 传送门 分析 此题是道好题! 首先要跳出思维定势,不是去想如何用数据结构去直接维护排序过程,而是尝试二分a[p]的值 设二分a[p]的值为x 我们将大于x的数标记为1,小于等于x的数标记为0 则 ...
- Choosing The Commander CodeForces - 817E (01字典树+思维)
As you might remember from the previous round, Vova is currently playing a strategic game known as R ...
- Ciel the Commander CodeForces - 321C (树, 思维)
链接 大意: 给定n结点树, 求构造一种染色方案, 使得每个点颜色在[A,Z], 且端点同色的链中至少存在一点颜色大于端点 (A为最大颜色) 直接点分治即可, 因为最坏可以涂$2^{26}-1$个节点 ...
- hdu 4747 mex 线段树+思维
http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...
- HDU - 6315 Naive Operations (线段树+思维) 2018 Multi-University Training Contest 2
题意:数量为N的序列a和b,a初始全为0,b为给定的1-N的排列.有两种操作:1.将a序列区间[L,R]中的数全部+1:2.查询区间[L,R]中的 ∑⌊ai/bi⌋(向下取整) 分析:对于一个位置i, ...
- luogu P4137 Rmq Problem / mex 主席树 + 思维
Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { ...
- Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维
Code: #include<bits/stdc++.h> #define maxn 500005 using namespace std; int n,Q,ty,lastans=0; i ...
随机推荐
- 【bzoj2438】[中山市选2011]杀人游戏 Tarjan
题目描述 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民 ...
- C#怎么调用方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Exep ...
- [AHOI2013]作业 & Gty的二逼妹子序列 莫队
---题面--- 题解: 题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队. 考虑区间[l, r]转移到[l, r + 1],那么对于维护 ...
- nowcoder 提高组模拟赛 选择题 解题报告
选择题 链接: https://www.nowcoder.com/acm/contest/178/B 来源:牛客网 题目描述 有一道选择题,有 \(a,b,c,d\) 四个选项. 现在有 \(n\) ...
- JSP AJAX之Form序列化登录体验
package web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletExc ...
- [HEOI2015]最短不公共子串
四合一的题. 简单粗暴的方法: 子串匹配——SAM 子序列匹配——序列自动机 关于序列自动机:序列自动机—— [FJOI2016]所有公共子序列问题 (其实这个玩意没有什么,n+1个点,每个点的字符集 ...
- HTTP请求中同步与异步有什么不同
普通的B/S模式就是同步,而AJAX技术就是异步,当然XMLHttpReques有同步的选项. 同步:提交请求->等待服务器处理->处理完毕返回.这个期间客户端浏览器不能干任何事. 异步: ...
- Codeforces Round #526 (Div. 2) A.B
A. The Fair Nut and Elevator 题目链接:https://codeforces.com/contest/1084/problem/A 题意: 一栋房子有n层楼,同时有个电梯( ...
- Android布局优化思考
一.关于RelativeLayout和LinearLayout的使用 由源码可以知道,RelativeLayout需要对其子View进行两次measure过程,而LinearLayout只需一次mea ...
- ES6学习笔记(一)——Promise
Promise 是 ES6 提供的一种异步编程的解决方案: 将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数(解决异步函数回调地狱的问题).Promise 对象保存着异步操作的结果. 首先 ...