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树只有返祖边.考虑下面这样一个结论. 结论:若一个点的子树中(包含自己)有两个点有到它祖先的返 ...
随机推荐
- Cesium渲染模块之概述
1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...
- Java语言输出菱形图型
package fuxi;public class Diamond { public static void main(String[] args) { printHollowRh ...
- CPU L1,L2,L3多级缓存的基本作用
基本作用 加快CPU与主内存之间的数据交换. 区别 缓存类型 L1 L2 L3 位置 最靠近CPU核心 次之 再次之 容量 一般几十KB~几百KB 几百KB~几MB 几MB~几十MB 速度 几个时钟周 ...
- spring 事务不生效
1.方法自身(this)调用问题,导致事务失效 非事务方法seckillVoucher()中调用的自身类的事务方法createVoucherOrder(). 解决办法: ps:要加aspj依赖,同时在 ...
- 【FPGA学习】MATLAB和FPGA实现FFT
本博客记录一下在matlab设计和在FPGA平台实现FFT的方法,平台是Xilinx的ZYNQ 参考: COE文件制作与使用 Vivado使用技巧(9):COE文件使用方法 .coe文件生成 在某些I ...
- linux移植问题记录
问题一 ~/linux/linux-5.2.8$ make s3c2410_defconfig HOSTCC scripts/basic/fixdep/bin/sh: 1: scripts/bas ...
- Java 8 在使用内存爆了以后会发生什么?hs_err_pid 日志如何看?
问题: Java进程被终止了,然后在应用的目录中发现了hs_err_pid日志. 运维反馈,结论是内存不够了 之前一直运行没有问题,没什么新增访问量,为什么会内存溢出,进程被killer掉类? 1.第 ...
- 类型提示和python函数中'->'的用法
一.类型提示 在python中,我们定义一个有参函数,调用该函数时需要传入参数,如下所示: # 定义一个简单的函数 def get_full_name(first_name, last_name): ...
- c++练习272题:金币
*272题 原题传送门:http://oj.tfls.net/p/272 题解:(遍历,60分) #include<bits/stdc++.h>using namespace std;lo ...
- 不需要鼠标交互的UI去掉RaycastTarget
UI事件会在EventSystem在Update的Process触发.UGUI会遍历屏幕中所有RaycastTarget是true的UI,接着就会发射线,并且排序找到玩家最先触发的那个UI,在抛出事件 ...