当前位置: 首页 > news >正文

CF2112D

注意到一条边无论方向如何,都能使两端的某一个点到达另一个点,即至少有 \(n-1\) 对。如果只需要 \(n-1\) 对,那么只需要在每一条链上相邻的边方向相反即可。对于剩下的一对,我们可以找到一个度数为 \(2\) 的点,并把连接的两条边由反向改为同向,那么附近的三个点产生的对数由 \(2\) 变成了 \(3\),达到要求(如果度数不为 \(2\),那么增加的对数一定不止 \(1\),不能达到要求)。如果找不到则无解。时间复杂度 \(O(\sum n)\)

#include<iostream>
#include<cstdio>
#include<vector>
#define N 200010
using namespace std;
vector<int> G[N];
int n,rt;
void dfs(int u,int fa,int op){for(auto v:G[u]){if(v==fa)continue;if(op)cout<<u<<' '<<v<<'\n';else cout<<v<<' '<<u<<'\n';dfs(v,u,op^1);}return;
}
void solve(){int u,v;rt=0;cin>>n;for(int i=1;i<=n;i++)G[i].clear();for(int i=1;i<n;i++){cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}for(int i=1;i<=n;i++)if(G[i].size()==2){rt=i;break;}if(!rt){cout<<"NO\n";return;}cout<<"YES\n";cout<<G[rt][0]<<' '<<rt<<'\n';cout<<rt<<' '<<G[rt][1]<<'\n';dfs(G[rt][0],rt,1);dfs(G[rt][1],rt,0);
}
int main(){int T;cin>>T;while(T--)solve();return 0;
}
http://www.rkmt.cn/news/2753.html

相关文章:

  • CF342C
  • LG9648
  • CF2111C
  • 唐人日记
  • ABC394G
  • MX 炼石 2026 NOIP #5
  • Visual Studio 2026 预览体验版现已发布,一起来看看带来哪些新功能!
  • 小题狂练 (J)
  • 诡异的mysql8的问题
  • 协议版iM蓝号检测,批量筛选iMessages数据,无痕检测是否开启iMessage服务
  • 工业互联网认知实训台-一句话介绍
  • 在Spring boot 中使用@master 设置主从数据库
  • 第 16 章反射(reflection)
  • 设计模式-组合模式 - MaC
  • 【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态
  • 设计模式-桥接模式 - MaC
  • Python 降序排序:轻松搞定列表、字典和自定义对象
  • 第02周 预习、实验与作业:Java基础语法2、面向对象入门
  • 2025实测:6款主流公众号编辑器大比拼,解决你的排版难题!
  • 设计模式-适配器模式 - MaC
  • 达梦数据库安装和使用
  • Ubuntu 界面变为 Mac
  • PVE9环境下飞牛OS安装vGPU驱动
  • 02020304 .NET Core核心基础组件04-配置系统、Json文件配置、选项方式读取、扁平化环境变量其它配置源
  • md格式
  • 第7篇、Kafka Streams 与 Connect:企业级实时数据处理架构实践指南
  • 202207_BUGKU_二维码GIF
  • 20250910NOIP模拟赛
  • 【2025最新推荐】AI大模型API中转站 | 国内直连ChatGPT/Claude/Gemini全系API接口服务
  • html怎么写