Tarjan的强联通分量

  求强联通分量有很多种。 《C++信息学奥赛一本通》  中讲过一个dfs求强联通分量的算法Kosdaraju,为了骗字数我就待会简单的说说。然而我们这篇文章的主体是Tarjan,所以我肯定说完之后再赞扬一下Tarjan大法好是不是

  首先我们讲一下强联通分量

  强联通分量指的是图的一个子图。在这个子图中,任意两个节点都可以互相到达。从定义上我们就可以看出是一个有向图来,因为任意一个无向图都符合该定义。

  而它的标准定义是:有向图中任意两点都联通的最大子图。

                     

  咳咳,首先庆祝一下哈——本人博客的第一张图。绘图历时3分钟。

  在咱们举的例子中,可以看出1 、2 、3 、5 通过边可以相互到达,它们算一个强联通分量,但4却被它们隔绝在外。从图中可以看出,从4点出发不能到达任意一个点。所以它单个节点也算一个强联通分量。所以图中的强联通分量有两个:一个是1-2-3-5,一个是4。

  ok看完了强联通分量是什么我们就讲一下Kosaraju。

  这个算法的思路是,对图进行DFS并记录每个点的退出顺序。再构造反图(就是有向边的方向全都反过来),按照退出顺序的逆序DFS反图,对得到的点进行染色即为强联通分量。

  讲完思路开始模拟。以起点1为起点遍历顺序如下:

  [ 1 2 3 5 4  5 3 2 4 4 1 ]

  加粗斜体外带下划线的部分就是本图的退出顺序。

  于是我们得到这样一个数组:[ 5 3 2 4 1 ] 。按照这个数组的逆序对反图遍历得到:

  [ 5 3 2 1 退出 4 退出 ]

  即得到要求的两个强联通分量。

  还要两遍DFS,麻烦的一比。看我大Tarjan一遍DFS就能求出强联通分量

  首先我们要明确Tarjan要用到的两个数组:dfn[] 和 low[] 

  dfn指的是在DFS过程中访问到该点的顺序。从1开始DFS全图,那么1的dfn值就是1,2的dfn值是2,5的dfn值是4,4的dfn值是5。剩下的一个类推

  那么low呢?low指的是如果逆着DFS序往前回溯,该节点最早是由哪个节点走过来的。

  比如在上图中2 、3 、5 、4 最早都是由1走过来的,所以它们的low值都是1

  下面贴出dfn和low的算法

每次dfs(点u){

  dfn[u] = 进入 dfs() 函数的次数  (自己定义一个时间戳记录 如 time)

       枚举与其相邻的点v{

          如果 没有 访问过点v {   ( 就是dfs树上的树边 )

        dfs(v);

        如果 v 能追溯 到 比“u 追溯到的最早的点” 更早的点;

        那么 u 就能 通过 v 来追溯到 那个点;

        low[u]=min(low[u],low[v]);

      }

       如果 访问过点v && v在栈中

       low[u]=min(low[u],dfn[v]); 

     }

  缩点

}

  上面那些伪代码是从伟大的GeneralLiu那里带过来的,在此先%%%

  然后  假设我们走到一个节点i,发现这个i不能继续扩展了,也就是dfn[i]==low[i]

  于是我们开始往回走。往回走的过程中,我们就把和它一个分量的节点进行染色,给它们统一的标记。  最后统计有多少种不同的标记即是强联通分量个数

  luogu的一道题刻录光盘非常好,可以用于练手。

  放代码

#include<iostream>
#include<cstring>
using namespace std;
int head[10000],num;
struct Edge{int next,to;
}edge[100000];
int stack[10000],top;
int color[10000],cnt;
int dfn[10000],low[10000];
int ID;
bool jd[10000];
int vis[10000];
inline void add(int from,int to){edge[++num]={head[from],to};head[from]=num;
}void tarjan(int x){dfn[x]=++ID;low[x]=ID;jd[x]=1;stack[++top]=x;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]);}else if(jd[to])    low[x]=min(low[x],dfn[to]);}if(dfn[x]==low[x]){jd[x]=0;color[x]=++cnt;while(stack[top]!=x){color[stack[top--]]=cnt;jd[stack[top+1]]=0;color[stack[top+1]]=cnt;}top--;}}int main(){int n;cin>>n;int x;for(int i=1;i<=n;++i){while(cin>>x&&x!=0){add(i,x);}}for(int i=1;i<=n;++i){if(!dfn[i])    tarjan(i);}memset(jd,0,sizeof(jd));for(int i=1;i<=n;++i){for(int j=head[i];j;j=edge[j].next){if(color[i]!=color[edge[j].to]){jd[color[edge[j].to]]=1;}}}int ans=0;for(int i=1;i<=cnt;++i)    if(!jd[i])    ans++;cout<<ans<<endl;return 0;
}

 

转载于:https://www.cnblogs.com/cellular-automaton/p/6895397.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XXE漏洞

简介 XXE (XML External Entity Injection) 漏洞发生在应用程序解析 XML 输入时&#xff0c;没有禁止外部实体的加载。 简单的理解&#xff0c;一个实体就是一个变量&#xff0c;可以在文档中的其他位置引用该变量。 实体主要分为四种&#xff1a; 内置实体 (Built-in entities…

Linq之Expression高级篇(常用表达式类型)

目录 写在前面 系列文章 变量表达式 常量表达式 条件表达式 赋值表达式 二元运算符表达式 一元运算符表达式 循环表达式 块表达式 总结 写在前面 首先回顾一下上篇文章的内容&#xff0c;上篇文章介绍了表达式树的解析和编译。如果忘记了&#xff0c;可以通过下面系列文章提供的…

NetCore框架WTM的分表分库实现

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

WordPress WP Photo Album Plus插件‘wppa-tag’跨站脚本漏洞

漏洞名称&#xff1a;WordPress WP Photo Album Plus插件‘wppa-tag’跨站脚本漏洞CNNVD编号&#xff1a;CNNVD-201301-458发布时间&#xff1a;2013-01-24更新时间&#xff1a;2013-01-24危害等级&#xff1a; 漏洞类型&#xff1a;跨站脚本威胁类型&#xff1a;远程CVE编号&…

SpringCloudAlibaba分布式流量控制组件Sentinel实战与源码分析(上)

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

【单元测试框架unittest】

转载于:https://www.cnblogs.com/ppppying/p/6899750.html

C++ 炼气期之基本结构语法中的底层逻辑

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

优惠券的工厂与策略模式实现方案

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

WP8.1学习系列(第九章)——透视Pivot开发指南

Windows Phone 8 的 Pivot 控件 2014/6/18 适用于&#xff1a;Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1 Windows Phone Pivot 应用提供了一种快速管理视图或页面的方法。该方法可以用于筛选大型数据集、查看多个数据集或切换应用视图。例如&a…

ESP8266 系统环境搭建

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

无线网络配置

转载于:https://www.cnblogs.com/lingxzg/archive/2013/02/09/2909606.html

Java编程之反射中的注解详解

“注解”这个词&#xff0c;可谓是在Java编程中出镜率比较高&#xff0c;而且也是一个老生常谈的话题。我们之前在聊Spring相关的东西时&#xff0c;注解是无处不在&#xff0c;之前我们简单的聊过一些“注解”的相关内容&#xff0c;比如在Spring中是如何进行“注解”组合的。…

SCCM 2012 R2实战系列之十三:辅助站点部署

由于最近几个月一直处于AD升级项目中&#xff0c;很久没有更新SCCM的技术文档了。SCCM 2012中的辅助站点部署方法还是比较特别的&#xff0c;需要注意的地方也非常多&#xff0c;今天跟大家分享辅助站点的具体部署和配置方法。1. 前提条件加入域环境 安装IIS组件安装BITS和远程…

DevOps落地实践点滴和踩坑记录-(1)

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

2014年度优秀员工代表发言稿

2019独角兽企业重金招聘Python工程师标准>>> 尊敬的各位领导和亲爱的同事们&#xff0c;大家好&#xff01; 作为优秀员工代表在这里发言&#xff0c;我很感谢刘总、周总、李总、漆总以及公司各层领导的信任和支持&#xff01;我感到十分荣幸&#xff0c;同时也感到…

无需另配定时器在STM32 HAL下实现微秒级延时(兼容FreeRTOS)

目录前言一、代码部分二、使用和验证1.引入头文件2.初始化3.使用和验证三、可移植性总结前言 接触HAL库差不多两年了&#xff0c;一直苦于HAL库没有自带微秒级的延时&#xff0c;网上的前辈们给出的解决方案要么是改写HAL_Delay的延时时间&#xff0c;要么就是额外占用一个定时…

×××S 2012 交互式报表 -- 同步交互式排序

S 2012 交互式报表 -- 同步交互式排序步骤1&#xff1a;首先&#xff0c;在刚才的“交互式排序”示例报表中再拖拉一个“Chart”&#xff0c;设置为长条图&#xff0c;从报表数据窗口中将销售金额、销售数量拖至“Values”&#xff0c;将产品大类拖放至“Category Groups”区域…

SpringCloud GateWay 万字详解

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

STM32 HAL 硬件IIC+DMA+简单图形库控制OLED

目录前言一、建立工程二、编写和移植前期准备驱动部分修改三、使用和验证结论&#xff08;2022年1月22日重制&#xff09;本文主要是移植带简单图形库的程序&#xff0c;如果只是实现DMA控制&#xff0c;建议看【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动…

python创建分类器小结

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…