dfs树是解决图中带环的利器。

前天CF的F题就是dfs树,但是当时我没有认真思考 觉着找到一个环过于困难 当时没有想到 也没理解dfs树的意义。

对于一张无向图求出一个dfs树 这个树有两种边 树边和非树边。

其中非树边连接的u v 他们一定具有祖先关系。

$注:这是一个很显然 也十分重要的性质。

应用:CF1325F Ehab's Last Theorem

给出一张无向联通图 且不存在重边 自环。定义\(m=\lceil sqrt(n)\rceil\)

求出图中一个环S 满足S是一个简单环 且\(|S|\geq m\)

或者求出图中一个independent set W 满足 W=m

求环或者求独立集 我们考虑一张无向图 很难求出最大的独立集 但是只是让求出一个大小为m的独立集。

考虑如何求环 dfs树。但是求不了最大环 但是我们要的也不是最大。我们利用非树边判断环的大小。

由于没有重边 自环 所以一个点连出w条非树边 那么显然有大小为w+1的环。

如果所有点都没有构成大小>=m的环 那说明每个点都最多有 m-2条非树边。

这个时候考虑最大独立集 当前点我们加入到我们的集合中 然后其最多影响m-2个点。

把能影响的都给标记了 最后我们发现最多能选 \(\lceil \frac{n}{m-1}\rceil\)个点 可以证明这个东西>=m.证毕。

所以我们直接上dfs树即可。值得注意的是 最后构造独立集的时候 需要从叶子节点构造。

可以证明 这样对其他节点的影响如上面的分析一样。

const int MAXN=200010;
int n,m,len=1,w,top,flag,cc;
int vis[MAXN],s[MAXN],d[MAXN],mark[MAXN],q[MAXN];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1];
inline void add(int x,int y)
{
ver[++len]=y;nex[len]=lin[x];lin[x]=len;
ver[++len]=x;nex[len]=lin[y];lin[y]=len;
}
inline void dfs(int x,int las)
{
if(flag)return;
vis[x]=1;s[++top]=x;
go(x)
{
if((i^1)==las)continue;
if(flag)break;
if(!vis[tn])
{
d[tn]=d[x]+1;
dfs(tn,i);
}
else if(d[x]-d[tn]+1>=w)
{
put(2);
put(d[x]-d[tn]+1);
int ww=d[x]-d[tn]+1;
while(ww)
{
printf("%d ",s[top]);
--top;--ww;
}
flag=1;
}
}
--top;
if(!mark[x])
{
q[++cc]=x;
go(x)mark[tn]=1;
}
} int main()
{
freopen("1.in","r",stdin);
get(n);get(m);
rep(1,m,i)add(read(),read());
w=(int)ceil(sqrt(n*1.0));
//put(w);
dfs(1,-1);
if(flag)return 0;
put(1);rep(1,w,i)printf("%d ",q[i]);
return 0;
}

当然dfs树还有应用 如上次我写了一道bzoj 的电压 那道题是真的比较妙 dfs树上差分。最后证明的是 其他环都是无效的 有dfs树上的环即可。

一道例题:LINK:2115 Wc2011 Xor

给出一张有向无环图 求出1~n的一条路径使得其xor和最大。路径可以经过同一条边同一个点 不过这样的路径的价值被计算相应次数。

显然一条路径出现两次相当于没出现。如何求这样的路径。可以考虑线性基求最大值。

dfs树的更多相关文章

  1. zstu.4191: 无向图找环(dfs树 + 邻接表)

    4191: 无向图找环 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 117  Solved: 34 Description 给你一副无向图,每条边有 ...

  2. BZOJ_4238_电压_树上差分+dfs树

    BZOJ_4238_电压_树上差分+dfs树 Description 你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)” ...

  3. LOJ2250 [ZJOI2017] 仙人掌【树形DP】【DFS树】

    题目分析: 不难注意到仙人掌边可以删掉.在森林中考虑树形DP. 题目中说边不能重复,但我们可以在结束后没覆盖的边覆盖一个重复边,不改变方案数. 接着将所有的边接到当前点,然后每两个方案可以任意拼接.然 ...

  4. Codeforces962F Simple Cycles Edges 【双连通分量】【dfs树】

    题目大意: 给出一个无向图,问有哪些边只属于一个简单环. 题目分析: 如果这道题我们掌握了点双连通分量,那么结论会很显然,找到每个点双,如果一个n个点的点双正好由n条边构成,那么这些边都是可以的. 这 ...

  5. BZOJ5203 [NEERC2017 Northern] Grand Test 【dfs树】【构造】

    题目分析: 首先观察可知这是一个无向图,那么我们构建出它的dfs树.由于无向图的性质我们可以知道它的dfs树只有返祖边.考虑下面这样一个结论. 结论:若一个点的子树中(包含自己)有两个点有到它祖先的返 ...

  6. 【BZOJ4424】Cf19E Fairy DFS树

    [BZOJ4424]Cf19E Fairy Description 给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成一个二分图. Input 第 1 行包含两个整数 n ...

  7. BZOJ4878 挑战NP-Hard(dfs树)

    既然是二选一,考虑两个问题有什么联系.题面没有说无解怎么办,所以如果不存在经过k条边的简单路径,一定存在k染色方案.考虑怎么证明这个东西,我们造一棵dfs树.于是可以发现如果树深>k(根节点深度 ...

  8. 【BZOJ】1023: [SHOI2008]cactus仙人掌图 静态仙人掌(DFS树)

    [题意]给定仙人掌图(每条边至多在一个简单环上),求直径(最长的点对最短路径).n<=50000,m<=10^7. [算法]DFS树处理仙人掌 [题解]参考:仙人掌相关问题的处理方法(未完 ...

  9. BZOJ4784 ZJOI2017仙人掌(树形dp+dfs树)

    首先考虑是棵树的话怎么做.可以发现相当于在树上选择一些长度>=2的路径使其没有交,同时也就相当于用一些没有交的路径覆盖整棵树. 那么设f[i]为覆盖i子树的方案数.转移时考虑包含根的路径.注意到 ...

  10. 【bzoj1123】[POI2008]BLO DFS树

    题目描述 Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. 输入 输入n<=100000 ...

随机推荐

  1. SpringCloud和SpringBoot对应的版本选型

    SpringBoot版本选择: 官网地址:https://spring.io/projects/spring-boot SpringBoot官方目前最新最稳定版:2.3.1,如果单独使用SpringB ...

  2. day06总结

    字符串常用操作# ======================================基本使用======================================# 1.用途:记录描述 ...

  3. session + cookie 实现登录功能

    前端部分代码实现 <div id="mainCp"> <div class="postForm"> <p> <labe ...

  4. lottery+web2

    lottery 题目分析 题目给了一个彩票网站,经过页面的探索,没有发现明显漏洞,进行目录扫描,发现该站存在.git文件 猜测存在源码泄露,使用githack利用: 获得网页源码,进行源码分析 源码审 ...

  5. selenium.common.exceptions.WebDriverException:no such session

    应该是browser对象关闭之后你又使用了

  6. Python并发编程05 /死锁现象、递归锁、信号量、GIL锁、计算密集型/IO密集型效率验证、进程池/线程池

    Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密集型效率验证.进程池/线程池 目录 Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密 ...

  7. java的干儿子锁Lock

    目录 Lock的由来 线程之间的交互 Lock方法简介 lock() lockInterruptibly() trylock() trylock(long,TimeUnit) unlock() new ...

  8. 软件测试中的微信小程序怎么测试?

    1.没有需求文档时,如何测试小程序?现在大多数公司的开发模式是:敏捷模式(用户故事) ,即以什么身份做什么事情会出现什么样的结果.那实际测试过程中,没有需求文档时,测试可以采用以下方式更好的完成测试工 ...

  9. Ethical Hacking - Web Penetration Testing(5)

    LOCAL FILE INCLUSION Allows an attacker to read ANY file on the same server. Access files outside ww ...

  10. OSCP Learning Notes - WebApp Exploitation(1)

    Installing XSS&MySQL FILE Download the Pentester Lab: XSS and MySQL FILE from the following webs ...