题意:

给定一颗树,往树上加边形成一个新的图,新图需要满足去除图中任意一条边,新图仍然连通。要求输出最少需要添加几条边以及具体的添边方式。

思路:

比赛的时候是没什么思路的,还是太cai了。

看了题解之后发现,可以先对整个树进行一个dfs,求出每个叶子节点的dfs序。添边肯定是对叶子节点进行添边,因此需要求出所有叶子节点的dfs序。

可以发现,连接两个叶子节点之后,则意味着这两个叶子节点间最短路径上的所有边都不会成为新图中的割边,因为这些边都包含在了一个环之中。

所以,我们需要根据dfs序进行连边,将dfs序数组切分两半,1与mid+1相连,2与mid+2相连...如果叶子数为奇数,则将最中间的两个叶子节点相连。这样连的话,就可以让连线尽可能地包含树中所有边。

此处有一种错误连法,假设一共有num个叶子节点,一开始我是1与num相连,2与num-1相连...认为这样的连接方式可以尽可能地包含树的所有边,但是当相连的两个叶子节点的dfs序不断靠近的时候,可能会使得两个兄弟节点相连,这样的话父亲节点向外连接的边就会成为割边,因此这种连接方法错误。应该让连接的两个叶子节点保持足够的距离才能尽可能地包含树中所有的边。

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
const int N = 1e5+1000;int n, head[N], tot, a[N], num, deg[N];
struct Edge{int to,next;
}e[N*2];void init()
{tot = 1;num = 0;memset(head,0,sizeof head);memset(deg,0,sizeof deg);
}void add(int x,int y)
{e[++tot].to = y, e[tot].next = head[x], head[x] = tot;
}void dfs(int s, int fa)
{if(deg[s] == 1)a[++num] = s;for(int i = head[s]; i ; i = e[i].next){int x = e[i].to;if(x == fa) continue;dfs(x,s);}
}void solve()
{rep(i,1,n){if(deg[i] != 1){dfs(i,-1);break;}}int ans = (num+1)/2;printf("%d\n",ans);int x1 = 1, x2 = ans+1;while(x2 <= num){printf("%d %d\n",a[x1],a[x2]);x1++, x2++;}if(num%2)printf("%d %d\n",a[ans],a[ans-1]);
}int main()
{freopen("kingdom.in","r",stdin);freopen("kingdom.out","w",stdout);scanf("%d",&n);init();rep(i,1,n-1){int x,y;scanf("%d%d",&x,&y);deg[x]++;deg[y]++;add(x,y);add(y,x);}solve();return 0;
}/*
5
1 2
2 3
3 4
3 5
*//*
4
1 2
1 3
1 4
*/

【Gym-100085 K】Kingdom Roadmap【树上构造题】相关推荐

  1. GYM 101173 K.Key Knocking(构造)

    原题链接 参考自 问题描述:一个长度为3*n的01串,每次可以翻转连续的两个字符,要求至多翻转n次使得这个3*n的串至少有2*n个连续的段且相邻两端不一样(就是连续的0算一段,然后连续的1,-) 解法 ...

  2. Codeforces Gym 101173 K. Key Knocking (构造)

    题意 对于给定的长为 3×N3\times N 的 01 字符串 S,求在最多变换 N 次下使得字符串 S 的 weight >= 2n . 字符串的 weight 为 相邻不同字符的个数 + ...

  3. CodeForces 459C(构造题)

    http://codeforces.com/problemset/problem/459/C /** 题意:有n个同学,k辆车,d天(每天n个同学去一个地方)问经过d天后,任意的多个同学不能总在一起d ...

  4. CDMA(牛客第八场构造题)

    链接:https://ac.nowcoder.com/acm/contest/888/C 来源:牛客网 Gromah and LZR have entered the third level. The ...

  5. Codeforces 482 - Diverse Permutation 构造题

    这是一道蛮基础的构造题. - k         +(k - 1)      -(k - 2) 1 + k ,    1 ,         k ,             2,    ....... ...

  6. [ACNOI2022]树上构造

    题目 题目背景 我的世界里,闯入两尊神:其一 炎翼鸟,其二 英陀罗. 夜卧床,窗外无光,脑中却是一片光明--是 炎翼鸟 的翅膀上的火焰,这火焰点燃的太阳.光芒如此灼烈,用手遮住双眼也徒劳:光弥散在空气 ...

  7. hdu 5710 Digit-Sum (构造题)

    题目链接:hdu 5710 Digit-Sum 题意: 定义S(n)=n的数位和,给你一个a,b让你找一个n使得a*S(n)=b*S(2n). 题解: 传送门 构造题很少做啊!! 太弱了 1 #inc ...

  8. CF1110E Magic Stones(构造题)

    这场CF怎么这么多构造题-- 题目链接:CF原网 洛谷 题目大意:给定两个长度为 $n$ 的序列 $c$ 和 $t$.每次我们可以对 $c_i(2\le i<n)$ 进行一次操作,也就是把 $c ...

  9. 字符串——BZOJ 3097: Hash Killer I【构造题,思维题】

    BZOJ 3097: Hash Killer I[构造题,思维题] 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3097 题意:让你出一组 ...

  10. CSUSTOJ-小樱的库洛牌(恶心的构造题)

    题目连接:http://acm.csust.edu.cn/problem/4020 博客园食用链接:https://www.cnblogs.com/lonely-wind-/p/13941902.ht ...

最新文章

  1. vb.net调用oracle存储过程,今天搞好了VB.NET调用Oracle存储过程返回游标的问题
  2. pythontxt文件怎么读_python怎么读txt文件
  3. 【控制】《现代控制理论》谢克明老师-第1章-控制系统的状态空间描述
  4. scatter 基本用法 python matplotlib
  5. 【教程】Linux DNS 服务器安装、配置及维护
  6. 树莓派AI视觉云台——2、树莓派系统镜像的下载和烧写
  7. wait 和 sleep 的区别
  8. 30-10-010-编译-IDEA下编译kafka 2.3源码
  9. python 运算符与流程控制
  10. jms pub/sub模型_JMS消息传递模型:点对点和发布/订阅
  11. Eclipse启动无响应,停留在Loading workbench状态
  12. 对象创建从农业社会到共产主义的发展
  13. matlab中的语言,把c语言变成matlab语言,可以在matlab中运行。
  14. mysql 纯真ip 导出dat_纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)
  15. 阿里巴巴大数据之路-数据整合管理体系
  16. 关于印发南山区引进高层次医学团队管理办法的通知
  17. 【考研英语语法】一般将来时练习题
  18. 最完整的PS快捷键大全(绝对经典)
  19. 中学-综合素质【1】
  20. 数据结构与算法3 树(上)树与树的表示

热门文章

  1. 百度下半年惩罚网站的低质量,坏消息到来硕士
  2. expect实现自动通过堡垒机登陆
  3. android分享到新浪微博,认证+发送微博,
  4. 中文的在一个字符串中查找另一个字符
  5. spring mvc+myibatis项目大致框架-spring mvc wendang
  6. 关于VMware的Server版卸载须知
  7. 旧金山散记(一):第一次在美国打车
  8. 【html5和css3】transition属性整理
  9. PHP修改防火墙ip,利用防火墙进行同网段下的ip地址欺骗
  10. 乐迪机器人正确操作_乐迪智能早教机器人好用吗 乐迪智能早教机器人使用测评...