热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tarjan找桥和割点与点连通分量与边连通分量【未成形】

之前只学了个强连通Tarjan算法,然后又摸了缩点操作;然后今天在lightoj摸了一道模板题,是求所有桥的题;然后发现&#

之前只学了个强连通Tarjan算法,然后又摸了缩点操作;

然后今天在lightoj摸了一道模板题,是求所有桥的题;

然后发现,要把:割点,割点集合,双连通,最小割边集合(桥),点连通分量,边连通分量都学一下。

--------------------

首先这个求割点是在无向图里面实现的(所以看到无向图有点感觉可以往这边考虑吧

先说割点,割点集合:

首先是割点这个问题啊,就是说在一个连通图里面,你删除某个点+这个点所连出去的边,图变成了不连通,就说这个点是割点,

然后呢我再说这句话就好理解了:在一个连通图中,如果有一个点集,删除这个点集+集合中所有点相关联的边,图变成了不连通,就称这个点集为割点集合。

若在连通图上至少删去k个顶点才能破坏图的连通性,则称此图的点连通度为k

然后说桥;

类似的,如果一个边集,删除这些边(注意是要求删去边集所有边以后)以后,原图连通性被破坏,就称这个点集为割边集合。

一个图的边连通度的定义为最小割边集合中的边数。

当且仅当这个图的边连通度是1,则割边集合的唯一元素被称为桥;


//以下摘自PKU的PDF和 bin神模板

求割点

看了别人的博客:对啊,首先就是暴力一点,根据定义,我遍历所有的点,判断一下图是不是不连通了。

因为暴力所以优化啊。

在深度优先遍历整个图的过程中形成一棵搜索树(思路和有向图求强连通分量类似 ):

第一种方法:

Dfn[u]定义和Tarjan算法一样,表示编号为i的节点在DFS过程中 的访问序号(也可以叫做开始时间)。 

Low[u]定义为u或者u的子树中能够通过非父子边(父子边就是搜索树上的边),追溯到的最早的节点的DFS开始时间;

一个顶点u是割点,当且仅当满足(1)或(2)

(1)    是树根(其实这个根就一个,就是最先进去的点),且u有多于一个子树。

(2)    u不为树根&#xff0c;且存在(u,v)为树枝边&#xff08;或称父子边&#xff0c;即u为v在搜索树中的父亲&#xff09;&#xff0c;使得dfn(u)<&#61;low[v];

我斌模板理解&#xff1a;

const int N&#61;1e4&#43;10;
const int M&#61;2e4&#43;10;struct Edge{int to;int next;
};
Edge q[M*2];
int head[M*2],tol,n,m;
int dfn[N],low[N];
int ind,top;
bool flag[N],vis[N];void init()
{tol&#61;0;memset(head,-1,sizeof(head));
}void add(int u,int v)
{q[tol].to&#61;v;q[tol].next&#61;head[u];head[u]&#61;tol&#43;&#43;;
}void Tarjan(int u,int pre)
{int v;int son&#61;0;low[u]&#61;dfn[u]&#61;ind&#43;&#43;;vis[u]&#61;true;for(int i&#61;head[u];i!&#61;-1;i&#61;q[i].next){v&#61;q[i].to;if(v&#61;&#61;pre)continue;if(!dfn[v]){son&#43;&#43;;Tarjan(v,u);low[u]&#61;min(low[v],low[u]);if(u!&#61;pre&&low[v]>&#61;dfn[u])//首先不是树根&#xff0c;且存在(u,v)为树枝边。flag[u]&#61;true;}elselow[u]&#61;min(low[u],dfn[v]);}if(pre&#61;&#61;u&&son>1)//是树根&#xff0c;且存在两棵子树flag[u]&#61;true;
}void qiugedian()
{//各种初始化&#xff1b;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(flag,0,sizeof(flag));ind&#61;1;Tarjan(1,1); //我们随便设个1作为树根&#xff0c;图上任意点都行&#xff0c;无所谓&#xff1b;int ans&#61;0;for(int i&#61;1;i<&#61;n;i&#43;&#43;)if(flag[i])ans&#43;&#43;;
}

下面还是草稿、下次更新桥。。。。 

-------------------


第二种方法&#xff1a;

也可以先用Tajan()进行dfs算出所有点的low和dfn值&#xff0c;并记录dfs过程中每个点的父节点&#xff0c;然后再把所有点看一遍&#xff0c;看其low和dfn,以找出割点和桥。

找桥的时候&#xff0c;要注意看有没有重边。有重边&#xff0c;则不是桥。


const int MAXN &#61; 10010;
const int MAXM &#61; 100010;
struct Edge
{int to,next;bool cut; //是否为桥的标记
} edge[MAXM];
int head[MAXN],tot;
int Low[MAXN],DFN[MAXN],Stack[MAXN];
int Index,top;
bool Instack[MAXN];
bool cut[MAXN];
int add_block[MAXN];//删除一个点后增加的连通块
int bridge;
void addedge(int u,int v)
{edge[tot].to &#61; v;edge[tot].next &#61; head[u];edge[tot].cut &#61; false;head[u] &#61; tot&#43;&#43;;
}void Tarjan(int u,int pre)
{int v;Low[u] &#61; DFN[u] &#61; &#43;&#43;Index;Stack[top&#43;&#43;] &#61; u;Instack[u] &#61; true; //入栈标记int son &#61; 0; //对于节点u的for(int i &#61; head[u]; i !&#61; -1; i &#61; edge[i].next){v &#61; edge[i].to;if(v &#61;&#61; pre) //如果是他的父亲节点continue;if(!DFN[v]){son&#43;&#43;;Tarjan(v,u);if(Low[u] > Low[v]) Low[u] &#61; Low[v];//桥//一条无向边(u,v)是桥&#xff0c;当且仅当(u,v)为树枝边&#xff0c;且满足DFN(u) DFN[u]){bridge&#43;&#43;;edge[i].cut &#61; true;edge[i^1].cut &#61; true;}//割点//一个顶点u是割点&#xff0c;当且仅当满足(1)或(2) //(1) u为树根&#xff0c;且u有多于一个子树//(2) u不为树根&#xff0c;且满足存在(u,v)为树枝边(或称父子边&#xff0c;即u为v在搜索树中的父亲)&#xff0c;使得DFN(u)<&#61;Low(v)if(u !&#61; pre && Low[v] >&#61; DFN[u])//不是树根{cut[u] &#61; true;add_block[u]&#43;&#43;;}}else if( Low[u] > DFN[v])Low[u] &#61; DFN[v];}//树根&#xff0c;分支数大于1if(u &#61;&#61; pre && son > 1) cut[u] &#61; true;if(u &#61;&#61; pre)add_block[u] &#61; son - 1;Instack[u] &#61; false;top--;
}



转:https://www.cnblogs.com/keyboarder-zsq/p/6216766.html



推荐阅读
  • 本文介绍了一种图的存储和遍历方法——链式前向星法,该方法在存储带边权的图时时间效率比vector略高且节省空间。然而,链式前向星法存图的最大问题是对一个点的出边进行排序去重不容易,但在平行边无所谓的情况下选择这个方法是非常明智的。文章还提及了图中搜索树的父子关系一般不是很重要,同时给出了相应的代码示例。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
author-avatar
年轻的周末我做主
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有