博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF981C Useful Decomposition【树/思维】
阅读量:5320 次
发布时间:2019-06-14

本文共 1386 字,大约阅读时间需要 4 分钟。

【链接】:

【题意】:给定一棵树,要求拆成若干条简单路径,并且这些路径都经过一个公共节点。给出任意一个解决方案,如不存在输出No。
【分析】:

因为是一棵树, 所以如果要求任意两条路线至少有一个公共点, 到最后, 所有的路线都会有唯一的公共点. 如果有两个公共点的话, 就至少有两条路线只包含其中的一条路线, 否则就会有环, 有了环就不是树了.也就是说, 所有的点, 除了那个唯一的公共点, 必须度数小于  2 .在所有点之中:度数为  1 的点是路线的一个端点.度数为  2 的是一条路线中除了两端以外的点.度数大于  2 的是路线的公共点. 如果有两个及以上的点的度数是大于  2 的, 代表不可能路线中任意两条至少交于一点, 输出 No.如果没有度数大于  2 的点, 代表只有一条路线.如何输出路线:先输出 Yes, 代表可以将树分解.接着输出路线的个数, 也就是度数为  1 的点的个数.接着, 对于每条路线, 输出其中一个度数为  1 的点和 唯一的 公共点.注意: 如果没有度数大于 2  的点, 代表只有一条路线, 此时路线个数并不等于度数为 1 的点的个数, 并且端点就是两个度数为  1 的点.

【代码】:

#include 
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
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;}

转载于:https://www.cnblogs.com/Roni-i/p/9130116.html

你可能感兴趣的文章
激活office 365 的启动文件
查看>>
无法根据中文查找
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
git安装和简单配置
查看>>
面向对象:反射,双下方法
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
课后作业-阅读任务-阅读提问-2
查看>>
面向对象设计中private,public,protected的访问控制原则及静态代码块的初始化顺序...
查看>>
fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程
查看>>
Awesome Adb——一份超全超详细的 ADB 用法大全
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
Android 将drawable下的图片转换成bitmap、Drawable
查看>>
介绍Win7 win8 上Java环境的配置
查看>>
移动、联通和电信,哪家的宽带好,看完你就知道该怎么选了!
查看>>
Linux设置环境变量的方法
查看>>
Atitit.进程管理常用api
查看>>
构建自己的项目管理方案
查看>>