热门标签 | 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



推荐阅读
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
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社区 版权所有