首页 > 其他分享 >点双边双强连通

点双边双强连通

时间:2023-07-18 15:33:58浏览次数:42  
标签:连通 点双 min int fa dfn low 双强 双边

点双/边双复习笔记

1.点双复习
割点:图中的一个点,没有这个点的话,这个图会变成两个图
点双:在一个点双内,一个点到另一个点的路径有两条及以上,并且点不会走一样的
注意事项:
1.割点特判:son<=1且fa = x的不是割点
2.环上出发特判:son=0&&fa=x的单独一个作为点双;
3.看好大于等于哦!
4.low[x]=min(low[to],low[x]);和low[x]=min(low[x],dfn[to]);注意区别(默写时这里出了问题)
算法思路:本质上是dfs,在dfs时记录一个点的最先遍历到的时间,成为dfn
维护这个点能到达的(除了不能走父亲连过来的那个边)最小dfn,成为low
利用性质找割点:要是一个节点的儿子dfs完了,但儿子的low是大于这个节点的dfn值,说明他的儿子只能经过父亲节点
回到优先遍历的点去,也就是说是割点,这时候弹栈直到这个儿子被弹出,这些弹出的和这个节点一起作为一个分量
然后这种dfs就叫tarjan(不会便利dfn已经有,也就是已经遍历过的节点)
注意下,老师说else low[x]=min(low[x],dfn[to]);要写else,否则的话可能会错。

重要代码

	void tarjan(int x,int fa){
	++t;
	dfn[x]=t;
	low[x]=t;
	s[++top]=x;
	int son=0;
	for(int i=0;i<mp[x].size();i++){
		int to=mp[x][i];
		if(to==fa){
			continue;
		}
		if(!dfn[to]){
			son++;
			tarjan(to,x);
			low[x]=min(low[to],low[x]);
			if(low[to]>=dfn[x]){
				cut[x]=1;
				cnt++;
				while(s[top+1]!=to){
					bcc[cnt].push_back(s[top]);
					top--;
				}
				bcc[cnt].push_back(x);
			}
		}
		else low[x]=min(low[x],dfn[to]);
		
	}
	if(fa==x&&son==0){
		bcc[++cnt].push_back(x);
	}
	if(fa==x&&son<=1){
		cut[x]=0;
	}
	}

2.点双晚自习背诵默写及练习
https://www.luogu.com.cn/problem/P3225
评测情况:https://www.luogu.com.cn/record/115919126

这个是自己默写了一遍点双,然后wa的,原因是.low[x]=min(low[to],low[x]);	    和          low[x]=min(low[x],dfn[to]);注意区别(默写时这里出了问题)

3.边双复习
割边:一个无向图,割去这条边,图就会分裂成多个图。
边双:不含这个割边的无向图。

写法差不多,和点双的区别在于
	1.判定变为严格>而不是>=
	2.栈的处理需要改变(出栈的结束点不同)
	3.判断条件改变了,而且放在了一个点dfs完后
!!!!!4.!!!!!!!!重边的计算要考虑在内!!!!!!!!!
	(模板没过),不然的话,我可能在fa==to那里错掉,因为
	她不能从父亲dfs过来的那条便那里来,但是可以从另一条边来(重边)
		
	但是,竟然是重边/自环,那么实质上这些重边性质都是相同的,都是链接u和v,然后我们又知道来的那条边有且只有一条
	所以我在代码里加了f,把第一个来自父节点的边不遍历,后面全都继续做
	AC了!!!!!
	https://www.luogu.com.cn/record/115923273

代码:

void tarjan(int x,int fa){
	++t;
	dfn[x]=t;
	low[x]=t;
	top++;
	s[top]=x;
	bool f=0;//用来判重边,自环 
	for(int i=0;i<mp[x].size();i++){
		int to=mp[x][i];
		
		if(to==fa&&f==0){
			f=1;
			continue;
		}
		if(!dfn[to]){
			tarjan(to,x);
			low[x]=min(low[x],low[to]);
		}
		else low[x]=min(low[x],dfn[to]);
	}
	if(low[x]==dfn[x]){
		cnt++;
		while(s[top+1]!=x){
			bcc[cnt].push_back(s[top]);
			top--;	
		}
	}
}

4.强连通分量:
其实强连通分量相比边双而言,就是在else low[x]=min(low[x],dfn[to]);这一句多了一句判断,要求to在栈里面才行
同时记得删去if(to==fa)continue这句,因为强连通分量时有向图

标签:连通,点双,min,int,fa,dfn,low,双强,双边
From: https://www.cnblogs.com/linghusama/p/17559055.html

相关文章

  • ITK 最大圆度连通域提取
    最大圆度概念:圆度计算(Circularity,Roundness)1Roundness=(4*CV_PI*Area)/(Perimeter*Perimeter)2doublegetRoundness(std::vector<cv::Point>contour)3{4doublefactor=(cv::contourArea(contour)*4*CV_PI)/(pow(cv::arcLength(contour,true......
  • [学习笔记] 割点 & 割边 & 双连通分量
    一、定义在无向连通图\(G=(V,E)\)中,若存在一个点\(u(u\inV)\)使得删掉点\(u\)及其相连的边,会使原图不连通,就称\(u\)是原图的一个割点(cutvertex);若存在一条边\((u,v)((u,v)\inE)\)满足删掉\((u,v)\)后会使原图不连通,就称\((u,v)\)是原图的一座桥(或......
  • 挑战程序竞赛系列(74):4.3强连通分量分解(1)
    挑战程序竞赛系列(74):4.3强连通分量分解(1)传送门:POJ2186:PopularCows题意:每头牛都想成为牛群中的红人。给定N头牛的牛群和M个有序对(A,B)。(A,B)表示牛A认为牛B是红人。该关系具有传递性,所以如果A认为B是红人,B认为C是红人,则A认为C是红人。注意:给定的有序对中可能包含(A,B)和(B,C......
  • [学习笔记] 强连通分量
    一、DFSForest从这张经典图说起:在给定的有向图\(G=(V,E)\)内,遍历这张图,其中边分为\(4\)种:树边(treeedge):黑色的边,每一次从\(u\)访问到一个未访问的节点\(v\),则称\((u,v)\)为树边。返祖边(backedge):红色的边,每一次从\(u\)回溯到一个\(u\)的已经访问的祖......
  • 230623 做题记录 // 强连通分量
    哈→啊↗/哈→啊↗啊↘/哈↘/哈→啊↗啊↘啊→/啊→啊↘啊↘啊→/哈↗啊→啊↘啊→/哈↗啊→啊↘啊↘/哈→啊↘啊↗啊↘原曲:花与树的女儿们A.时间戳http://222.180.160.110:1024/contest/3698/problem/1?合着强制链式前向星?邻接表党震怒!所以决定reverse……......
  • 1595. 连通两组点的最小成本 (Hard)
    问题描述1595.连通两组点的最小成本(Hard)给你两组点,其中第一组中有size₁个点,第二组中有size₂个点,且size₁>=size₂。任意两点间的连接成本cost由大小为size₁xsize₂矩阵给出,其中cost[i][j]是第一组中的点i和第二组中的点j的连接成本。如果两个组中......
  • UWB定位 三基站加一个标签UWB相关资料 dwm1000模块 uwb定位 ds-twr测距 dw1000模块,
    UWB定位三基站加一个标签UWB相关资料dwm1000模块uwb定位ds-twr测距dw1000模块,双边双向测距,研创物联代码,最多支持4基站8标签测距,基站和标签、信道、速率等配置可通过USB虚拟串口进行切换,支持连接官方上位机(有QT5源码),可实现测距显示及定位坐标解算并显示位置,原理图,PCB,手册等......
  • 1595. 连通两组点的最小成本
    给你两组点,其中第一组中有size1个点,第二组中有size2个点,且size1>=size2。任意两点间的连接成本cost由大小为size1xsize2矩阵给出,其中cost[i][j]是第一组中的点i和第二组中的点j的连接成本。如果两个组中的每个点都与另一组中的一个或多个点连接,则称这两组点......
  • 连通两组点的最小成本
    如果两个组中的每个点都与另一组中的一个或多个点连接,则称这两组点是连通的返回连通两组点所需的最小成本1.状态压缩+动态规划classSolution{public:intconnectTwoGroups(vector<vector<int>>&cost){//这里使用状态压缩记录连通状态,同时使用动态规划最......
  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节点,个数还要加\(1\)。示例程序1(C++11,POJ不支持):#include<bits/stdc++.h>......