tarjan算法和缩点
tarjan可以找强连通的分量,但它的作用不只局限于此
缩点,说白了,就是建新图,之后的操作在新图上进行
自己看代码
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,cot,cont;//n 点数 m 边数 cnt 计数器 cot 强连通分量的计数器 cont 判断是否有符合要求的点
struct edge//邻接表
{
int u,v,nxt;//u 起点 v 终点 nxt 指向上一条边
};
edge e[60000000],g[60000000];//e 原题的图 g 缩点后的图
int h[6000],dfn[6000],low[6000],lt[6000];
//h 记录该点发出的最后一条边 dfn,low,lt tarjan算法要用
// dfn 在dfs中被搜到的时间戳(可简单理解为标号) low 该点可以回溯到的灰点的时间戳(标号) lt 记录这个点属于哪个强连通分量
stack<int> s;
void add1(int,int);// 建原题的图
void add2(int,int);// 建缩点后的图
void tarjan(int u)//tarjan算法 (模板)
{
dfn[u]=low[u]=++cnt;
s.push(u);
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(!dfn[v])//如果该点没被搜到(没标过号),从这个点往下搜
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else
{
if(!lt[v])//如果该点标过号,但不属于任何强连通分量
{
low[u]=min(low[u],dfn[v]);//比较谁是父亲,谁是儿子
}
}
}
if(dfn[u]==low[u])//当一个点dfn==low时,就说明这是一个强连通分量
{
lt[u]=++cot;
while(s.top()!=u)//将栈中元素取出,这些元素都是一个强连通分量里的
{
lt[s.top()]=cot;
s.pop();
}
s.pop();//将该点踢出栈
}
}
int main()
{
memset(h,0,sizeof h);
memset(dfn,0,sizeof dfn);
memset(low,0,sizeof low);
memset(lt,0,sizeof lt);
memset(chu,0,sizeof chu);
memset(ans,0,sizeof ans);
cnt=0,cot=0,cont=0;//初始化过程
scanf("%d",&n)
scanf("%d",&m);
for(int u,v,i=1;i<=m;++i)
{
scanf("%d%d",&u,&v);
add1(u,v);//加边,建图
}
cnt=0;
for(int i=1;i<=n;++i)
{
if(!dfn[i]) tarjan(i);//找强连通分量
}
cnt=0;
memset(h,0,sizeof h);//清0,建缩点后的图 ,也可以新开一个数组
for(int i=1;i<=m;++i)
{
int u=lt[e[i].u],v=lt[e[i].v];
if(u!=v)//u!=v说明他们不在一个强连通分量里
{
add2(u,v);//缩点
}
}
return 0;
}
void add1(int u,int v)//存边建原图
{
e[++cnt].u=u;
e[cnt].v=v;
e[cnt].nxt=h[u];
h[u]=cnt;
}
void add2(int u,int v)//缩点建新图
{
g[++cnt].u=u;
g[cnt].v=v;
g[cnt].nxt=h[u];
h[u]=cnt;
}
tarjan算法和缩点的更多相关文章
- Tarjan算法(缩点)
因为最近在学2sat,需要学习前置技能—Tarjan算法,所以花了一天的时间学习这个算法 算法步骤: 1.从一个点开始dfs,并加入栈 2.如果下一个点没有到过,跳到第一步 3.如果下一个点到过,并且 ...
- 【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点
题目链接:http://poj.org/problem?id=1236 题意:给定一个表示n所学校网络连通关系的有向图.现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u ...
- tarjan算法求缩点+树形DP求直径
hdu4612 Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- tarjan算法 习题
dfs树与tarjan算法 标签(空格分隔): 517coding problem solution dfs树 tarjan Task 1 给出一幅无向图\(G\),在其中给出一个dfs树\(T\), ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...
- 图论算法-Tarjan模板 【缩点;割顶;双连通分量】
图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; ...
- tarjan算法(强连通分量 + 强连通分量缩点 + 桥(割边) + 割点 + LCA)
这篇文章是从网络上总结各方经验 以及 自己找的一些例题的算法模板,主要是用于自己的日后的模板总结以后防失忆常看看的, 写的也是自己能看懂即可. tarjan算法的功能很强大, 可以用来求解强连通分量, ...
- tarjan算法(求强连通子块,缩点)
tarjan算法求图中的强连通子图的个数. #include<iostream> #include<stack> #include<queue> #include& ...
- Tarjan算法初探(2):缩点
接上一节 Tarjan算法初探(1):Tarjan如何求有向图的强连通分量 Tarjan算法一个非常重要的应用就是 在一张题目性质在点上性质能够合并的普通有向图中将整个强连通分量视作一个点来把整张图变 ...
随机推荐
- CSS常用技术
1.处理图片底部 5px 间距 <style> body {background: #2d97db;} .imgBox { background: #fff; font-size: 0; ...
- VMware 虚拟机图文安装和配置 AlmaLinux OS 8.6 教程
前言: 这是<VMware 虚拟机图文安装和配置 Rocky Linux 8.5 教程>一文的姐妹篇教程,如果你需要阅读它,请点击这里. 2020 年,CentOS 宣布:计划未来将重心从 ...
- 135_Power Query M语言快捷输入之输入法设置自定义短语
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 因为工作原因,把电脑重装了下,当敲M的时候总感觉那里不对.原来是我的M自定义短语没有同步.由于我的自定义短语还是 ...
- 3000帧动画图解MySQL为什么需要binlog、redo log和undo log
全文建立在MySQL的存储引擎为InnoDB的基础上 先看一条SQL如何入库的: 这是一条很简单的更新SQL,从MySQL服务端接收到SQL到落盘,先后经过了MySQL Server层和InnoDB存 ...
- 多态——JavaSE基础
多态 同一个方法可以根据对象的不同采取不同的动作 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多 基本条件: 有继承关系 子类重写父类方法 父类引用指向子类对象Father f1 = ne ...
- Training loop Run Builder
以下内容来自deeplizard pyorch_P31
- Base64编码知识详解
在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...
- 1.设计模式第一步-《设计模式从头到脚舔一遍-使用C#实现》
更新记录: 完成第一次编辑:2022年4月23日20:29:33. 加入小黄人歌曲:2022年4月23日21:45:36. 1.1 设计模式(Design Pattern)是什么 设计模式是理论.是前 ...
- JS:对象调方法1
找调用者 1.如果有this,就先看this在哪个函数中,就是离this最近的function,没有就是window 2.找到函数后,辨别哪个是调用者 例1: 点击查看代码 function fn() ...
- 新上线!3D单模型轻量化硬核升级,G级数据轻松拿捏!
"3D模型体量过大.面数过多.传输展示困难",用户面对这样的3D数据,一定不由得皱起眉头.更便捷.快速处理三维数据,是每个3D用户对高效工作的向往. 在老子云最新上线的单模型轻量化 ...