首页 > 其他分享 >圆方树

圆方树

时间:2024-10-22 10:23:11浏览次数:3  
标签:cnt int back 圆方树 low push dfn

小粉兔 圆方树

兔已经讲的非常好了,我就讲我的理解吧!!!

大多数情况下,图论是比树结构要复杂多的,所以引入了一个圆方树的一种数据结构。

把无向图转化为由原点与点双连通分量组成的树,原图的每一个点都是一个圆点,每一个点双都是一个方点,所以形成的新图有 \(n+c\) 个点,每个点双转为方点时形成一个菊花图。

我直接上代码!!

  • 要从新图上建边建点。

  • cnt 要初始化为 n。

  • 注意退栈操作,最后记住把top退出。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=400005;
#define ll long long


int n;
int s,t;
vector<int> v[N],a[N];
int low[N],dfn[N],top=0,st[N],cnt,tot;

void tarjan(int x){
	low[x]=dfn[x]=++tot;
	st[++top]=x;
	for(int y:v[x]){
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
			
			if(low[y]==dfn[x]){
				++cnt;
				for(int b=0;b!=y;--top){
					b=st[top];
					a[cnt].push_back(b);
					a[b].push_back(cnt);
				}	
				a[cnt].push_back(x);
				a[x].push_back(cnt);
			} 
		}	
		else{
			low[x]=min(low[x],dfn[y]);
		} 
	}
}

signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	cnt=n;
	for(int i=1;i<=m;i++){
		cin>>u>>vv;
		v[u].push_back(vv);
		v[vv].push_back(u);	
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
			top--;
		}
	}
    return 0;
}

标签:cnt,int,back,圆方树,low,push,dfn
From: https://www.cnblogs.com/sadlin/p/18492013

相关文章

  • 圆方树
    点双联通分量:对一张图,若其不含割点,则其为一个点双。1,对于点双中的两个点(除只有两点一边的特殊图),可以视作其必然存在两条不同的简单路径,使两者经过的并集为空。2,对于点双中任意一对点,经过它们的简单路径的并集一定为点双本身,意即可以认为两点间简单路径可以通过点双内任意一点。......
  • 圆方树
    定义割点:无向图中,若删除点及其连边,连通块变多,那么被删除的点为割点点双连通:若无向图中点对\(x,y\),删除任意非\(x\)和非\(y\)节点后,\(x\)和\(y\)任然连通,陈\(x,y\)点双连通点双连通子图:无向图中的一个子图\(G\),\(G\)中任意2点都是联通的,那么称\(G\)为原图的点双......
  • 圆方树学习笔记 & 最短路 题解
    前言圆方树学习笔记,从一道例题讲起。题目链接:Hydro&bzoj。题意简述仙人掌上求两点距离。题目分析为了把仙人掌的性质发挥出来,考虑将其变成一棵树。圆方树就是这样转换的工具。先讲讲圆方树的概念:原图上的点为圆点,每个点双对应一个方点,树边都是方点连向点双内的圆点。具......
  • 圆方树
    定义圆方树:将无向图转化为树形结构的数据结构,使得树上2点路径上的点都是原图的必经点。圆点:原无向图\(G\)中的点,仍然保留在圆方树中,称之为圆点。方点:将每一个点双连通分量新建一个“方点”。树边:每一个方点都向对应的点双内的圆点连边。基本性质:性质一:圆方树的总点数=......
  • 圆方树
    一些概念割点:无向图中,若删除点x及其连边,连通块变多,那么x为割点。点双连通:若点对x和y,删除任意非x和非y节点后,x和y仍然联通,称x和y点双连通。点双联通子图:无向图中的一个子图G,G中任意两点都是点双连通的,那么G为原图的一个点双连通子图。点双联通分量:无向图中的极大点双联通子图......
  • 【算法学习】圆方树——处理仙人掌的利器
    圆方树大概分两种,一个是圆方树,一个是广义圆方树。圆方树这可以解决仙人掌上的问题。任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌。很多题解将其作为无向图构建,本文将其构建为外向树,在这个问题中两种构建方式不会影响求解。构建方式记读入的图为原图,构建的......
  • 圆方树
    圆方树这里的圆方树指广义圆方树。对于一张\(n\)个点的无向图,其中包含\(k\)个点双,那么这张图建出的圆方树一共有\(n+k\)个点,其中前\(n\)个点为原图中的点,称为圆点,后\(k\)个点每个点代表一个点双,称为方点,每个点双与其中包含的点连边构成一个菊花,这\(k\)个菊花经由图......
  • 圆方树学习笔记
    圆方树学习笔记圆方树是优秀的图论算法,从仙人掌图向无向图扩展,利用割点和点双联通分量的性质,实现了图向树的转换。对仙人掌的处理:圆方树——处理仙人掌的利器而且实现十分简单算法思路前置知识割点和桥,点双联通分量。思路对于一个无向图,圆方树理解可以如下:原图中点是圆......
  • 圆方树学习笔记
    今天在做ABC318G这道题,要用到圆方树的知识,于是就去学了圆方树。学习圆方树首先需要学习点双连通分量以及缩点,此处不多赘述。圆方树中分两种类型的点:圆点和方点。圆点指的是原来的无向图中的所有点,而方点指的是每一个点双连通分量所代表的点。相当于每一个点双连通分量就是一个......
  • 圆方树 useful things
    圆方树,是解决仙人掌问题的实用方法,假设最初图都是圆点,对于每个环新建一个方点并连接这个环上所有圆点,能很好规避同一个点可能属于很多个环的情况,并且发现build完之后是一棵树广义圆方树,能够不局限于去解决仙人掌问题,能上升到无向图层面,很好解决图上路径类,等等问题那么如何建立圆......