码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 圆方树 useful things


    圆方树,是解决仙人掌问题的实用方法,假设最初图都是圆点,对于每个环新建一个方点并连接这个环上所有圆点,能很好规避同一个点可能属于很多个环的情况,并且发现build完之后是一棵树

    广义圆方树,能够不局限于去解决仙人掌问题,能上升到无向图层面,很好解决图上路径类,等等问题

    那么如何建立圆方树?有点类似 v−dcc ,建立方点,连接当前点双联通分量的所有点,实现通过tarjan算法

    但注意 v−dcc 把整个点双联通分量都缩成一个点了,圆方树还保持着圆点,也就是说圆方树点数是 n+k ,其中 k 标号是点双个数

    具体实现不详讲,但存在值得注意的细节:

    令 now 为当前 dfs 到的节点, y 为其搜索树上的一个儿子。注意, now 与 y 在栈中不一定相邻。也就是说,下面两种写法:

    1. 弹出栈顶直到弹出 now 为止;最后再压入 now
    2. 弹出栈顶直到弹出 y 为止,最后再将虚点向 now 连边
      前者错误,后者正确。

    代码:

    void tarjan(int x){
    	++nown;
    	dfn[x]=low[x]=++num;
    	st.push(x),w[x]=-1; 
    	for(int i=head[x];i;i=edge[i].Next){
    		int to=edge[i].to;
    		if(!dfn[to]){
    			tarjan(to);
    			low[x]=min(low[x],low[to]);
    			if(low[to]>=dfn[x]){
    			    addedge2(++diannum,x),addedge2(x,diannum);
    				++w[diannum];
    				while(1){
    					addedge2(diannum,st.top()),addedge2(st.top(),diannum);
    					++w[diannum];
    					if(st.top()==to){
    						st.pop();
    						break;
    					}
    					st.pop();
    				}
    			}
    		}
    		else low[x]=min(low[x],dfn[to]);				
    	}
    }
    

    v−dcc 和圆方树运用区别何在?后者对于点双内部的处理能够非常方便,而前者似乎处理整个点双对答案的贡献(不考虑单点)会十分好搞

    圆方树的性质:

    1. 是树

    2. 每条边都是方点和圆点连接边

    3. 每个方点对应一个点双联通分量

    4. 方点的度数是点双联通分量的大小

    5. 圆点是割点才有超过1个儿子,否则只连接一个方点儿子

    6. 圆方树上两个点的路径经过的圆点是图上两点之间的必经点

    还有一些点双的小性质:对于一个点双的两点,它们之间简单路径的并集等于这个点双集合

    圆方树能够很好地将无向图上问题转化为树上问题,进行统计类的时候可能割点会被统计多次,所有一般把方点赋为-1,然后就很好做了,等等就不细说了

  • 相关阅读:
    cookie和session区别
    KubeSphere核心实战_kubesphere部署redis02_创建redis现指定存储卷_配置外网访问服务---分布式云原生部署架构搭建048
    TypeScript - 枚举 - 常量枚举
    滑动平均窗口的定义,优点,缺点,以及目前的应用!!
    【踩坑】POST 方法的基于摘要的协商缓存实现
    【分布式事务】深入探索 Seata 的四种分布式事务解决方案的原理,优缺点以及在微服务中的实现
    牛客错题笔记
    STL简介
    常用的Spring Boot注解及其作用
    阿里云服务器大降价,在今年买服务器是真便宜!老用户可买99元服务器
  • 原文地址:https://www.cnblogs.com/blueparrot/p/17818136.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号