强联通分量(tarjan算法+算法简介)
题目描述
输入
第一行两个数V,E,表示顶点数和边数
接下来E行,两个数s,t,描述一条有向边
输出
强连通分量的个数
求强联通分量当然可以暴力,不过慢一些
今天我们讲讲tarjan算法(更快解决您的需求哦= ̄ω ̄=)
首先我们需要2个数组,1个数组是时间戳(dns),用于判断某点是否是某强联通分量的起点
另一个数组是low,用于记录某点属于哪一个强联通分量。
在我们遍历每个点时,初始状态就是dns[i]=low[i]=++tot;//tot为目前遍历点的编号
接下来我们利用链表寻找下一个点
如果这个点还未被访问那么我们就访问他tarjan(g[i].to);
如果我们已经访问了这个点,那我们判断一下它是否在栈内(没错!tarjan算法利用的就是栈)
如果在栈内(如果不在栈内那么不属于一个强联通分量,不用更新low数组),则更新low数组(保证low数组最小)low[i]=min(low[i],low[g[i].to]);
最后我们判断一下如果low[i]=dns[i]即该点为此次查找的强连通分量的起点
然后我们查找在它之后进栈的元素,让他们出站,答案+1;
当然,有些图不只一个连通图
所以我们要每一个点都遍历一遍,如果没有便历过,那么就进行tarjan
由于每一个点都进栈一次,出栈一次
所以最坏复杂度为O(n+m)
下面贴代码(终于打完了。。手残。。)
#include<cstdio>
inline int read()
{
int x=;char c;
while((c=getchar())<''||c>'');
for(;c>=''&&c<='';c=getchar())x=x*+c-'';
return x;
}
#define MN 10000
#define MM 50000
struct edge{int nx,t;}e[MM+];
int h[MN+],en,d[MN+],l[MN+],cnt,z[MN+],zn,inz[MN+],K;
inline void ins(int x,int y){e[++en]=(edge){h[x],y};h[x]=en;}
void tj(int x)
{
d[x]=l[x]=++cnt;inz[z[zn++]=x]=;
for(int i=h[x];i;i=e[i].nx)
{
if(!d[e[i].t])tj(e[i].t);
if(inz[e[i].t]&&l[e[i].t]<l[x])l[x]=l[e[i].t];
}
if(d[x]==l[x])for(++K;z[zn]!=x;)inz[z[--zn]]=;
}
int main()
{
int n,m,i;
n=read();m=read();
while(m--)i=read(),ins(i,read());
for(i=;i<=n;++i)if(!d[i])tj(i);
printf("%d",K);
}
下面贴代码
强联通分量(tarjan算法+算法简介)的更多相关文章
- 强联通分量-tarjan算法
定义:在一张有向图中,两个点可以相互到达,则称这两个点强连通:一张有向图上任意两个点可以相互到达,则称这张图为强连通图:非强连通图有极大的强连通子图,成为强联通分量. 如图,{1},{6}分别是一个强 ...
- 强联通分量之kosaraju算法
首先定义:强联通分量是有向图G=(V, E)的最大结点集合,满足该集合中的任意一对结点v和u,路径vu和uv同时存在. kosaraju算法用来寻找强联通分量.对于图G,它首先随便找个结点dfs,求出 ...
- [vios1023]维多利亚的舞会3<强联通分量tarjan>
题目链接:https://vijos.org/p/1023 最近在练强联通分量,当然学的是tarjan算法 而这一道题虽然打着难度为3,且是tarjan算法的裸题出没在vijos里面 但其实并不是纯粹 ...
- POJ 3592 Instantaneous Transference(强联通分量 Tarjan)
http://poj.org/problem?id=3592 题意 :给你一个n*m的矩阵,每个位置上都有一个字符,如果是数字代表这个地方有该数量的金矿,如果是*代表这个地方有传送带并且没有金矿,可以 ...
- 有向图的强联通分量 Tarjan算法模板
//白书 321页 #include<iostream> #include<cstdio> #include<cstring> #include<vector ...
- POJ 3114 Countries in War(强联通分量+Tarjan)
题目链接 题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为0. 思路 :强连通分量缩点之后,求最短路.以前写过,总感觉记忆不深,这次自己敲完再写了一遍. #include ...
- hdu 1269 (强联通分量Tarjan入门)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- Tarjan 算法求割点、 割边、 强联通分量
Tarjan算法是一个基于dfs的搜索算法, 可以在O(N+M)的复杂度内求出图的割点.割边和强联通分量等信息. https://www.cnblogs.com/shadowland/p/587225 ...
- 【强联通图 | 强联通分量】HDU 1269 迷宫城堡 【Kosaraju或Tarjan算法】
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明 ...
随机推荐
- 猜数字问题 python
猜数字问题,要求如下: ① 随机生成一个整数 ② 猜一个数字并输入 ③ 判断是大是小,直到猜正确 ④ 判断时间提示:需要用time模块.random模块该题目不需要创建函数 import random ...
- poj 3111 卖珠宝问题 最大化平均值
题意:有N件分别价值v重量w的珠宝,希望保留k件使得 s=v的和/w的和最大 思路:找到贡献最大的 设当前的s为mid(x) 那么贡献就是 v-w*x 排序 ,取前k个 bool operator&l ...
- java实时监听日志写入kafka(多目录)
目的 实时监听多个目录下的日志文件,如有新文件切换到新文件,并同步写入kafka,同时记录日志文件的行位置,以应对进程异常退出,能从上次的文件位置开始读取(考虑到效率,这里是每100条记一次,可调整) ...
- Android 数据库的线程合作
前言:之前琢磨了很多线程相关的东西,一直摸不着头脑,直到学到了数据库,终于发现世界原来如此美好,任何事物都有存在的理由. 1.主线程,我把它比作长江,作为母亲河的长江,想必大家每个人都不会很陌生. 2 ...
- SpringMVC---springMVC配置文件(springweb.xml)简介
再web.xml中设置HTTP请求的中央调度处理器DispatcherServlet时,会指定SpringMVC配置文件,这里取名springweb.xml是因设置DispatcherServlet时 ...
- python中全局变量的修改
对于全局变量的修改,如果全局变量是int或者str,那么如果想要在函数中对函数变量进行修改,则需要先在函数内,声明其为global,再进行修改 如果是list或者dict则可以直接修改 a = 1 b ...
- Spark 的情感分析
Spark 的情感分析 本文描述了基于 Spark 如何构建一个文本情感分析系统.文章首先介绍文本情感分析基本概念和应用场景,其次描述采用 Spark 作为分析的基础技术平台的原因和本文使用到技术组件 ...
- eclipse集成python(Pydev插件安装)
1.下载PyDev的压缩包,解压后会有features和plugins两个文件夹,将两个文件夹的内容拷贝到eclipse对应的文件夹中,重新启动eclipse 2.配置python 2.1打开ecli ...
- gradle构建
https://blog.csdn.net/baidu_30809315/article/details/77865414
- CS局域网射击
2/3D游戏:3D 辅助插件:角色控制器 游戏制作难度系数:中级 用到的其他工具:network 一.解决由于子弹射击速度过快而无法打到物体的问题 //方法一: ; Vector3 originalP ...