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之函数的进阶

    1.名称空间: 定义:用来存放名字的(变量,函数名,类名,引入的模块名) 分类: 内置名称空间:python解释器提供好的一些内置内容 全局名称空间:py文件中自己写的变量 局部名称空间:执行函数时会 ...

  2. CentOS7软件环境

    一.软件环境 1.1 centos7 [root@centos7 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [r ...

  3. 好客租房44-react组件基础综合案例-5发表评论-1

    发表评论 1给按钮绑定点击事件 2在事件处理程序中 通过state获取评论信息 3将评论信息添加到state中 并调用setState()方法更新数据 //导入react import React f ...

  4. 目标检测复习之Anchor Free系列

    目标检测之Anchor Free系列 CenterNet(Object as point) 见之前的过的博客 CenterNet笔记 YOLOX 见之前目标检测复习之YOLO系列总结 YOLOX笔记 ...

  5. HMS Core分析服务6.5.0版本更新啦

    卸载用户价值的合理评估对制定相应的用户召回策略具有重要意义. HMS Core分析服务新版本支持查看用户卸载前使用次数.崩溃次数等指标.通过这些数据,您可以更直观地判断已卸载人群粘性以及崩溃问题对用户 ...

  6. npm init cabloy背后的故事

    背景 我们知道许多框架会提供一个脚手架工具,我们先下载安装脚手架工具,然后再通过脚手架命令行来创建项目.在npm@6.1.0中引入了npm init <initializer>的语法.简单 ...

  7. 001 手把手用Git,Git从入门到上传本地项目到Github,看这篇就够了

    安装git 下载Git 下载好后,一路next即可 安装好后,打开Git bash,进行配置 首先配置自己的身份 git config --global user.name "Name&qu ...

  8. pytorch 中 repeat 和 expend 的功能和区别

    功能 均是用于扩展张量的维度 区别 tensor.expand(*sizes) 将张量中单维度(singleton dimensions,即张量在某个维度上为1的维度,exp(1,2,3),其中在第一 ...

  9. 循序渐进 Redis 分布式锁(以及何时不用它)

    场景 假设我们有个批处理服务,实现逻辑大致是这样的: 用户在管理后台向批处理服务投递任务: 批处理服务将该任务写入数据库,立即返回: 批处理服务有启动单独线程定时从数据库获取一批未处理(或处理失败)的 ...

  10. Operator介绍

    一.Operator简介 在Kubernetes中我们经常使用Deployment.DaemonSet.Service.ConfigMap等资源,这些资源都是Kubernetes的内置资源,他们的创建 ...