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算法和缩点的更多相关文章

  1. Tarjan算法(缩点)

    因为最近在学2sat,需要学习前置技能—Tarjan算法,所以花了一天的时间学习这个算法 算法步骤: 1.从一个点开始dfs,并加入栈 2.如果下一个点没有到过,跳到第一步 3.如果下一个点到过,并且 ...

  2. 【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点

    题目链接:http://poj.org/problem?id=1236 题意:给定一个表示n所学校网络连通关系的有向图.现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u ...

  3. tarjan算法求缩点+树形DP求直径

    hdu4612 Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  4. tarjan算法 习题

    dfs树与tarjan算法 标签(空格分隔): 517coding problem solution dfs树 tarjan Task 1 给出一幅无向图\(G\),在其中给出一个dfs树\(T\), ...

  5. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)

    Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...

  6. 图论算法-Tarjan模板 【缩点;割顶;双连通分量】

    图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; ...

  7. tarjan算法(强连通分量 + 强连通分量缩点 + 桥(割边) + 割点 + LCA)

    这篇文章是从网络上总结各方经验 以及 自己找的一些例题的算法模板,主要是用于自己的日后的模板总结以后防失忆常看看的, 写的也是自己能看懂即可. tarjan算法的功能很强大, 可以用来求解强连通分量, ...

  8. tarjan算法(求强连通子块,缩点)

    tarjan算法求图中的强连通子图的个数. #include<iostream> #include<stack> #include<queue> #include& ...

  9. Tarjan算法初探(2):缩点

    接上一节 Tarjan算法初探(1):Tarjan如何求有向图的强连通分量 Tarjan算法一个非常重要的应用就是 在一张题目性质在点上性质能够合并的普通有向图中将整个强连通分量视作一个点来把整张图变 ...

随机推荐

  1. python+pytest接口自动化(15)-日志管理模块loguru简介

    python自带日志管理模块logging,使用时可进行模块化配置,详细可参考博文Python日志采集(详细). 但logging配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理, ...

  2. 虚拟机中CentOS-7.9的硬盘空间扩容(EXSI)

    目录 一.增加虚机容量 二.创建新的分区 三.格式化新分区 四.lvm实现卷扩容 五.文件系统的扩容 大家好,我是LSF,发现一台虚机上 /dev/mapper/centos-root Use%已经快 ...

  3. 3.Docker常用命令

    帮助启动类命令 启动docker: systemctl start docker 停止docker: systemctl stop docker 重启docker: systemctl restart ...

  4. JS 的立即执行函数

    JS 的立即执行函数 本文写于 2019 年 12 月 7 日 其实 ES6 之后有了之后,很多之前的用法都没必要了,立即执行函数就是其一. 今天看到一道面试题: 请「用自己的语言」简述 立即执行函数 ...

  5. MinIO学习

    1.Minio及背景 Minio是一个开源的分布式文件存储系统,它基于 Golang 编写,虽然轻量,却拥有着不错的高性能,可以将图片.视频.音乐.pdf这些文件存储到多个主机,可以存储到多个Linu ...

  6. find-文件搜索

    根据条件搜索文件. 语法 find 目录 [选项] 选项 -name <filename> 按文件目录名查找.文件目录名可使用通配符"*",即表示模糊匹配所有字符. - ...

  7. Hadoop进程理解

    进程理解 HDFS相关进程理解(NN,DN,SSN) NameNode中存放的是数据文件与元数据的映射信息,数据文件和block快的映射信息,block块和DataNode的映射信息,前两者存放在磁盘 ...

  8. 【可视化分析案例】用python分析B站Top100排行榜数据

    一.数据源 之前,我分享过一期爬虫,用python爬取Top100排行榜: 最终数据结果,是这样的: 在此数据基础上,做python可视化分析. 二.数据读取 首先,读取数据源: # 读取csv数据 ...

  9. 【SpringSecurity系列1】基于SpringSecurity实现前后端分离无状态Rest API的权限控制

    源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...

  10. 开源项目 PM 浅谈如何设计官网

      有用户反馈进入官网首页光秃秃的一片,大家忙着做产品,忽略了官网的建设,惭愧惭愧.   确实,极简风格和极其简单还是有很大区别的.     旧的 Web 端   除了极其简单之外,它还有一个小问题, ...