图论---tarjan

本文详细介绍了图论中的Tarjan算法,包括有向图缩点、无向图割点和点双连通分量的求解。通过实例和代码解析,阐述了如何使用Tarjan算法在不同场景下找到强连通分量、割点以及点双连通分量,并强调了算法的关键判断条件和注意事项。
摘要由CSDN通过智能技术生成

本篇文章主要是对tarjan不同用法的讲解 , 其主要目的是复习,当然初学也可以看鸭极有可能看不懂
目录 :1.有向图缩点
2.无向图割点
3.点双连通分量

1.有向图缩点
首先来一道经典题目

给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
洛谷3387 缩点

这个题的话很明显我们要用tarjan进行缩点,在图中寻找强连通分量对吧,因为这个点如果我们可以走过去的话,那么他所在的连通分量我们也可以都走一遍在回到这里。
当我们缩晚点之后,剩下的就一定是一个有向无环图(DAG)
证明的话可以用反证法 , 如果还有环的话就肯定还有连通 ,但这显然不可能
然后我们在这个图上进行一个dp + 拓扑就可以了(这两个不重要)

所以现在我们就来缩点!!! 先上代码!

#include<bits/stdc++.h>
using namespace std ; 
const int M = 100000 + 5 ;
vector<int> g[M] ;
int bccnum[M] ; 
int dfn[M] , low[M] ; 
int zhi[M] , z[M] , vis[M] , sum[M] , ru[M]; 
int ans ; 
int gx[6666][6666] , dis[6666];
stack<int> s ; 
int cloc = 0 ; 
int bccnt = 0 ; 
inline void tarjan( int u , int fa)
{
   
    dfn[u] = low[u] = ++cloc ;  
    s.push(u) ;  
    for( int i =
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值