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. 【总结】2022GDOI普及组 没得游记

    因为是线上,所以没得游记 Day -3 学校安排去7班上课,好耶! 上午全是主科,有一节生物 被你七班捧上天了 被你七班造谣说我暴踩Everyone,还传到九班,给我玩阴的是吧 下午模拟赛,初一第一 ...

  2. axios源码解析 - 请求拦截器

    axios请求拦截器,也就是在请求发送之前执行自定义的函数. axios源码版本 - ^0.27.2 (源码是精简版) 平时在业务中会这样去写请求拦截器,代码如下: // 创建一个新的实例 var s ...

  3. Vue3 与依赖注入

    Vue3 与依赖注入 本文写于 2021 年 2 月 19 日 在 React 中,我们可以通过 context 与 useContext 实现单例.注入--等诸多特性. 详细请看上一篇文章:如何利用 ...

  4. 交互式 .Net 容器版

    背景介绍 在之前的文章 - 交互式 .Net 中已经介绍了什么是交互式 .Net,文中是通过 Visual Studio Code 插件的方式实现交互式 .Net 的.现在,我们将使用容器的方式实现交 ...

  5. ABP框架之——数据访问基础架构

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享阅读心得,希望我的文章能成为你成长路上的一块垫脚石,我们一起精进. 几乎所有的业务应用程序都要适用一种数据库基础架构,用来实现数据访问逻辑,以便从数 ...

  6. 纯CSS如何禁止用户复制网页的内容?

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  7. WC2015 题解

    K小割 题目链接:WC2015 K小割 Description 题目很清楚了,已经不能说的更简洁了-- Solution 这道题出题人挺毒的,你需要针对不同的部分分施用不同的做法 . 第\(1\)部分 ...

  8. vue大型电商项目尚品汇(前台篇)day05终结篇

    前台部分到此结束,一路走来还挺怀念,今天主要是对整个项目的完成做一个最后的收尾工作,对于功能上的需求没有什么了,主要就是项目上线的一些注意事项. 一.个人中心二级路由 当我们点击查看订单应该跳转到个人 ...

  9. (C++)读取一个输入的int型十进制数字的位数,并正序输出每个位上的值(不同数位的值用1个空格字符间隔)

    1 /* 2 程序功能:读取一个输入的int型十进制数字的位数,并正序输出每个位上的值(不同数位的值用1个空格字符间隔). 3 例如:当输入985这个数字时,显示如下信息: 4 985是一个3位数字! ...

  10. 使用Rclone将Onedirve挂载到Linux本地

    1. centos挂载onedrive时, 需要安装fuse. # 安装fuse yum -y install fuse 2. 安装完fuse后使用rclone进行挂载 #创建挂载目录 mkdir - ...