kosaraju算法
这个是求一个图有几个强联通分量的算法
先讲一下应该流程
首先输入一个图G,创建一个反向的图GT
图G

对图进行dfs遍历,纪录每个点结束搜索的时间p[i]
p[1]=2 p[2]=1 p[3]=5 p[4]=4 p[5]=3
接下来对GT进行dfs搜索

对图GT进行搜索的时候,先从之前纪录的时间最晚的点开始搜索
就是从点3开始搜索
若是3能在反向图中搜索到4意味着正向图中存在一条4->3的路 意思就是3和4互相抵达构成连通分量
因为是时间从晚到早 所以不存在说从中间的某个点开始的情况
意思就是不会出现下面的情况:
对GT进行搜索
先从2开始 搜索到1
1之后没有点 纪录12是一个连通分量
接下来345是一个连通分量
但其实12不是一个连通分量
所以我们从最晚的点开始搜索来避免这种情况
接下来介绍为什么从最晚的点开始搜索能避免这种情况
一个新图 只有1、2两个点
1点是在2点之后结束搜索的
那么有两种情况 第一种是 dfs(1)->dfs(2)->dfs(2)结束->dfs(1)结束
第二种 dfs(2)->dfs(2)结束 dfs(1)->dfs(1)结束
因为我们是从最后结束的点开始搜索
即对反向图从1开始搜索
那么假设反向图中1能搜索到2 那么说明原图的2能到达1
既然原图的2能够到达1 那么就不会出现dfs(2)->dfs(2)结束 dfs(1)->dfs(1)结束这种情况
否则为什么dfs(2)不进入dfs(1)呢
所以原图的1能够到达2
然后就是GT图 1能搜索到2 那么原图2能搜索到1 说明1和2连通
结论:按原图dfs结束时间对方向图进行搜索,搜索到的点都能够构成连通分量
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = ;
vector<int> G[maxn],G2[maxn];
int p[maxn];
bool q[maxn];
int n;
int cnt = ;
void dfs(int u);
void dfs2(int u);
int main()
{
int i,j;
char str[];
scanf("%d",&n);
for(i=;i<=n;++i)
{
scanf("%s",str+);
for(j=;j<=n;++j)
{
if(str[j] == '')
{
G[i].push_back(j);
G2[j].push_back(i);
}
}
}
memset(q, , sizeof(q));
for(i=;i<=n;++i)
dfs(i);
int sum = ;
memset(q, , sizeof(q));
for(i=n;i>=;--i)
{
if(q[p[i]] == false)
{
sum ++ ; dfs2(p[i]);
}
}
cout << sum << endl;
return ;
}
void dfs(int u)
{
q[u] = true;
for(int i=;i<G[u].size();++i)
{
if(q[G[u][i]] == false)
{
dfs(G[u][i]);
}
}
p[cnt++] = u;
}
void dfs2(int u)
{
int i;
q[u] = true;
for(i=;i<G2[u].size();++i)
{
if(q[G2[u][i]] == false)
{
dfs2(G2[u][i]);
}
}
}
kosaraju算法的更多相关文章
- Kosaraju 算法检测有向图的强连通性
给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strong ...
- Kosaraju 算法查找强连通分支
有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v, ...
- 半连通分量--Tarjan/Kosaraju算法
一个有向图称为半连通(Semi-Connected),满足:对于图中任两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. 若满足,则称G’是G的一个导出子图. 若G’是G的导出子图,且G’半 ...
- Kosaraju算法---强联通分量
1.基础知识 所需结构:原图.反向图(若在原图中存在vi到vj有向边,在反向图中就变为vj到vi的有向边).标记数组(标记是否遍历过).一个栈(或记录顶点离开时间的数组). 算法描叙: :对 ...
- Kosaraju 算法
Kosaraju 算法 一.算法简介 在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量.它利用了一 ...
- codevs1506传话(kosaraju算法)
- - - - - - - - 一个()打成[] 看了一晚上..... /* 求强连通分量 kosaraju算法 边表存图 正反构造两个图 跑两边 分别记下入栈顺序 和每个强连通分量的具体信息 */ ...
- Kosaraju算法解析: 求解图的强连通分量
Kosaraju算法解析: 求解图的强连通分量 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 定义 连通分量:在无向图中,即为连 ...
- Kosaraju算法详解
Kosaraju算法是干什么的? Kosaraju算法可以计算出一个有向图的强连通分量 什么是强连通分量? 在一个有向图中如果两个结点(结点v与结点w)在同一个环中(等价于v可通过有向路径到达w,w也 ...
- 7-6-有向图强连通分量的Kosaraju算法-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第7章 图 - 有向图强连通分量的Kosaraju算法 ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严 ...
- Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
一.背景介绍 强连通分量是有向图中的一个子图,在该子图中,所有的节点都可以沿着某条路径访问其他节点.强连通性是一种非常重要的等价抽象,因为它满足 自反性:顶点V和它本身是强连通的 对称性:如果顶点V和 ...
随机推荐
- centos7更换镜像源
更换软件源 由于国外的软件源在yum 安装时比较慢,更换为国内的源,以阿里的源的更换方式 下载wgetyum install wget -y echo 备份当前的yum源mv /etc/yum.rep ...
- p值还是 FDR ?
p值还是 FDR ? 差异分析 如何筛选显著性差异基因,p value, FDR 如何选 经常有同学询问如何筛选差异的基因(蛋白).已经计算了表达量和p value值,差异的基因(蛋白)太多了,如何筛 ...
- UI设计教程分享:字体变形—阴阳收缩法
阴阳师中国古代对自然规律发展变化基础因素的描述,是古代美学逻辑思维.推理分析的核心要素,也是描述万物基本要素和成因的概念之一.阴阳代表事物的对立关系,它是自然界的客观规律,是万物运动变化的本源,是人类 ...
- String... to 可变参数的使用
public class testMail { public static void fun(int... x) { for(int i = 0;i < x.length;i++) { Syst ...
- windows一键配置 php mysql apache 记录
记录下 方便查找(最近机器老重装 资料丢失严重) wamp http://www.wampserver.com/en/#download-wrapper https://sourceforge.net ...
- webapp利用iscroll实现同时横滚|竖滚
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- idea+tomcat 端口占用
ntelliJ IDEA和Tomcat整合注意事项(转) 这两天一直在学习IDEA这个开发工具,今天再整合tomcat的时候遇到了问题,运行时总是报错,说是8080端口被占用,把我就搞的郁闷了,我就尝 ...
- 一个简单的NodeJs静态页面的web服务器
主要功能 1 显示www文件夹下静态html或文本类型的文件. 2 缺省访问文件功能. 通过config.js的defaultfile属性设置 3 如果文件夹下没有缺省文件,显示文件夹下文件列表 4 ...
- 浅谈System.gc()
今天巩固给大家讲讲System.gc().Java的内存管理着实给各位编程者带来很大的方便,使我们不再需要为内存分配烦太多神.那么讲到垃圾回收机制,就不得不讲讲System.gc(). 先简单 ...
- git版本控制工具的使用(3)
git remote查看远程库的信息get remote -v可以更详细,查看推送和抓取权限 git push origin master把本地的master提交到远程的库对应的主分支 gt push ...