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算法一个非常重要的应用就是 在一张题目性质在点上性质能够合并的普通有向图中将整个强连通分量视作一个点来把整张图变 ...
随机推荐
- JavaScript 数据结构与算法3(链表)
学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 1.链表 本章学习如何实现和使用链表这种动态的数据结构 ...
- 前端HTML-01
HTML是什么? 超文本标记语言,是一种用于创建网页的标记语言 文件的扩展名:.html或者.htm HTML不是什么? HTML是一种标记语言,不是变成语言. HTML文档结构 <!DOCTY ...
- Centos 7以上安装Docker (亲测有效)
一.安装前的准备 我的环境是VMware15虚拟机安装的Centos7,Linux内核是3.10.0-1062.4.1.e17.x86_64 1. 用root账户登录查看操作系统内核版本及相关信息 [ ...
- DirectX11 With Windows SDK--39 阴影技术(VSM、ESM)
前言 上一章我们介绍了级联阴影贴图.刚开始的时候我尝试了给CSM直接加上PCSS,但不管怎么调难以达到说得过去的效果.然后文章越翻越觉得阴影就是一个巨大的坑,考虑到时间关系,本章只实现了方差阴影贴图( ...
- 从NSSRound#1学到了什么
sql_by_sql 二次注入: 更改密码的功能形如: update user set password='%s' where username='%s'; 的语句就可以存在二次注入,即假设有个adm ...
- TinyMCE简介
TinyMCE是一款开源.易用.UI时新的富文本编辑器. 插件丰富,自带插件基本满足要求 可扩展性强,可自定义功能 界面好看,符合现代审美 提供经典.内联.沉浸无干扰三种模式 官网:https://w ...
- CSAPP 之 ShellLab 详解
前言 本篇博客将会详细介绍 CSAPP 之 ShellLab 的完成过程,实现一个简易(lou)的 shell.tsh 拥有以下功能: 可以执行外部程序 支持四个内建命令,名称和功能为: quit:退 ...
- debconf-utils-交互式安装时预配置
debconf-utils是一个可以在Ubuntu下预先配置要安装程序的小工具,它可以避免在安装一个DEB程序时的弹窗输入问题,这可能在编写一键部署脚本的时候非常有用. 以下我们用安装MySQL-AP ...
- Vue问题
vue问题 #(1)vouter的addRoutes方法---用户权限 //自定义添加路由方法,防止重复添加路由 #使用后 路由结构 const user = () => import('../ ...
- 构建第一个模型:KNN算法(Iris_dataset)
利用鸢尾花数据集完成一个简单的机器学习应用~万丈高楼平地起,虽然很基础,但是还是跟着书敲了一遍代码. 一.模型构建流程 1.获取数据 本次实验的Iris数据集来自skicit-learn的datase ...