codeforces 1391E Pairs of Pairs dfs树的性质
https://codeforces.com/problemset/problem/1391/E
题意:给一个无向图,找出以下任意一种输出答案
1,长度>=n/2(上界)的简单路径(没有同一个点走2次的路径)
2,点对树>=n/2(上界)的点对集,使得点对集内部的任意两个点对的4个点,边数不超过2
解法:
根据dfs树的性质,每个点x的出边只有树边和返祖边两种,返祖边只会连到x的祖先节点,所以任意一个节点的两颗子树没有横向边。

这个题先从某个点导出一颗dfs树,如果深度>=n/2(上界),直接输出路径即可。
否则,直接让同深度的点配对即可,深度低于n/2(上界),树必然宽,横向同深度的点对配对后加起来总点对树一定>=n/2(上界)。

#include<bits/stdc++.h> using namespace std; typedef long long ll;
const int maxn=500100;
const int INF=(1<<29); int n,m;
int u,v;
vector<int> G[maxn];
vector<int> T[maxn];
vector<int> node[maxn];
int dep[maxn];
int max_dep[maxn];
vector<int> path;
vector<pair<int,int> > prs;
bool vis[maxn]; void init(){
for(int i=0;i<=n;i++) G[i].clear(),node[i].clear(),dep[i]=0,vis[i]=0,max_dep[i]=0,T[i].clear();
path.clear();prs.clear();
} void input(){
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
} void dfs(int u,int f){
if(vis[u]) return;
vis[u]=1;
if(u!=1) T[f].push_back(u);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==f) continue;
dfs(v,u);
}
} void go(int u){
path.push_back(u);
int next=u;
for(int i=0;i<T[u].size();i++){
int v=T[u][i];
if(max_dep[v]>=max_dep[next]) next=v;
}
if(next==u) return;
go(next);
} void get_d(int u,int f,int d){
dep[u]=d;
max_dep[u]=d;
node[d].push_back(u);
for(int i=0;i<T[u].size();i++){
int v=T[u][i];
get_d(v,u,d+1);
max_dep[u]=max(max_dep[u],max_dep[v]);
}
} void solve(){
init();
input();
dfs(1,0);
get_d(1,0,1);
if(max_dep[1]>=(n+1)/2){
go(1);
puts("PATH");
cout<<(int)path.size()<<endl;
for(int i=0;i<path.size();i++) cout<<path[i]<<" ";cout<<endl;
}
else{
for(int i=2;i<=max_dep[1];i++){
if((int)node[i].size()<2) continue;
for(int j=1;j<node[i].size();j+=2) prs.push_back(make_pair(node[i][j-1],node[i][j]));
}
puts("PAIRING");
cout<<(int)prs.size()<<endl;
for(int i=0;i<prs.size();i++) cout<<prs[i].first<<" "<<prs[i].second<<endl;
}
} int main(){
// freopen("in.txt","r",stdin);
int T;cin>>T;
while(~scanf("%d%d",&n,&m)) solve();
return 0;
}
另一点就是把长程序分解分模块写,可以减少bug,更好排查,出错的时候更容易理清主体思路,思路永远优先于码速。
codeforces 1391E Pairs of Pairs dfs树的性质的更多相关文章
- Codeforces 842C--Ilya And The Tree(dfs+树)
原题链接:http://codeforces.com/contest/842/problem/C 题意:一个以1为根节点的树,每个节点有一个值ai,定义美丽度:从根节点到这个节点的路径上所有ai的gc ...
- 【BZOJ1064】[Noi2008]假面舞会 DFS树
[BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...
- Solution -「CF 1391E」Pairs of Pairs
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的无向图,在其上找到一条包括不少于 \(\lceil\frac{n}2\rceil\ ...
- codeforces 1076E Vasya and a Tree 【dfs+树状数组】
题目:戳这里 题意:给定有n个点的一棵树,顶点1为根.m次操作,每次都把以v为根,深度dep以内的子树中所有的顶点(包括v本身)加x.求出最后每个点的值为多少. 解题思路:考虑到每次都只对点及其子树操 ...
- zstu.4191: 无向图找环(dfs树 + 邻接表)
4191: 无向图找环 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 117 Solved: 34 Description 给你一副无向图,每条边有 ...
- Codeforces 219D. Choosing Capital for Treeland (树dp)
题目链接:http://codeforces.com/contest/219/problem/D 树dp //#pragma comment(linker, "/STACK:10240000 ...
- BZOJ_4238_电压_树上差分+dfs树
BZOJ_4238_电压_树上差分+dfs树 Description 你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)” ...
- LOJ2250 [ZJOI2017] 仙人掌【树形DP】【DFS树】
题目分析: 不难注意到仙人掌边可以删掉.在森林中考虑树形DP. 题目中说边不能重复,但我们可以在结束后没覆盖的边覆盖一个重复边,不改变方案数. 接着将所有的边接到当前点,然后每两个方案可以任意拼接.然 ...
- Codeforces962F Simple Cycles Edges 【双连通分量】【dfs树】
题目大意: 给出一个无向图,问有哪些边只属于一个简单环. 题目分析: 如果这道题我们掌握了点双连通分量,那么结论会很显然,找到每个点双,如果一个n个点的点双正好由n条边构成,那么这些边都是可以的. 这 ...
- BZOJ5203 [NEERC2017 Northern] Grand Test 【dfs树】【构造】
题目分析: 首先观察可知这是一个无向图,那么我们构建出它的dfs树.由于无向图的性质我们可以知道它的dfs树只有返祖边.考虑下面这样一个结论. 结论:若一个点的子树中(包含自己)有两个点有到它祖先的返 ...
随机推荐
- DBeaver连接clickhouse无法下载驱动的情况
最近遇到dbeaver 连接clickhouse的时候提示下载驱动失败. 在网上找了些方法也不行,其中包括默认下载.配置阿里云的Maven. 最后在网上找到一个驱动包,自己手动添加即可.把下载地址分享 ...
- 【故障公告】Kubernetes 集群节点宕机造成博客站点故障
非常抱歉!今天 18:40-18:55 左右 Kubernetes 集群一台高配节点突然宕机,造成博客站点故障,访问时出现 502 Bad Gateway,由此给您带来麻烦麻烦,请您谅解. 发现故障并 ...
- 设备树编译链接报错arch/arm/boot/dts/imx50.dtsi:16:42: fatal error: dt-bindings/
1.vim scripts/Makefile.lib, add 3 lines into dtc_cpp_flags dtc_cpp_flags = -Wp,-MD,$(depfile).pre.t ...
- b站m4s视频混流
1.下载ffmpeg工具 https://ffmpeg.zeranoe.com/builds/ 这个网站估计是挂了. 由于 Zeranoe 已经不再编译.发布 FFMPEG,可从以下网址下载其他开发者 ...
- vue常用插件集合(常用,但一般UI库又不太能满足)
# v-base-plugins ``` bash # install npm i v-base-plugins --save npm start #引入 import myPlugin fr ...
- SAR成像(四):多普勒频移的计算
雷达系统中,雷达与目标间的相互运动会使回波信号产生频移,称为多普勒效应,对应的频移称为多普勒频率. 假设雷达发射信号为单频连续波, f ( t ) = c o s ( 2 π f 0 t + ϕ ) ...
- SpringBoot 启动报循环依赖问题
问题现象 Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating b ...
- js树搜索框查询所有匹配节点及父节点(纯js实现)
// 搜索框输入查询树节点(纯前台js) //name 搜索框输入的值: //wgObj.dwtreeDateAll 为树 的全量数据 // titleArr 与输入框匹配的节点数组 //arrTar ...
- Windows2016安装.NetFramework 3.5
Windows2016安装.NetFramework 3.5 Windows2016服务器默认安装的是 .Net 4.6.2版本,但是有时候我们经常会需要用到.Net 3.5版本.以下介绍的是在线和离 ...
- PVE使用vlan