当前位置: 首页 > news >正文

tarjan强联通分量(模板)

来,水水模板吧。。。。。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 10000
using namespace std;
int x,y,n,m,t,tot,sum,top,time;
int head[N],col[N],stack[N],dfn[N],low[N],a[N][N];
bool vis[N];
struct Edge
{
    int from,next,to;
 }edge[N];
int add(int x,int y)
{
    tot++;
    edge[tot].to=y;
    edge[tot].next=head[x];
    head[x]=tot;
}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return f*x;
}
int tarjan(int now)
{
    t=0;
    dfn[now]=low[now]=++time;//初始每一个点的low值dfn等于它的时间戳 
    stack[++top]=now; vis[now]=true;//将该点入栈,标记为在栈中 
    for(int i=head[now];i;i=edge[i].next)//更新于他相连的点的low值 
    {
        x=edge[i].to;
        if(vis[x]) low[i]=min(dfn[x],low[i]);//如果该点已经在栈中 
        else if(!dfn[x])
        {
            tarjan(x);
            low[i]=min(low[x],low[i]);//从该点继续拓展 
        }
    }
    if(low[now]==dfn[now])//说明以这个点结束强连通分量 
    {
        sum++;// 强连通分量的个数加一 
        col[now]=sum;//将该点放在她所属的强连通分量了 
        for(;stack[top]!=now;top--)
        {
            col[stack[top]]=sum;
            vis[stack[top]]=false;
        }
        vis[now]=false;
        top--;
     } 
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=m;i++)
     {
         x=read();y=read();
         add(x,y);
     }
    for(int i=1;i<=n;i++)
      if(!dfn[i]) tarjan(i);
    printf("%d",sum);
    return 0;
}

 

转载于:https://www.cnblogs.com/z360/p/7020449.html

相关文章:

  • 4.3.4 空值与聚合函数
  • AC日记——矩阵取数游戏 洛谷 P1005
  • 【Docker镜像】docker默认存放路径
  • iOS多线程---NSOperation的常用操作
  • Spring源码-IOC容器(六)-bean的循环依赖
  • Android 图片缓存处理
  • iOS中 OC字符串 与 C语言字符串 相互转换
  • php+Ajax 例子
  • 英语句型——口语
  • 三重积分计算--切片法
  • 关于梦想
  • 不用軟體解PPT密碼
  • 元组
  • activemq使用
  • 一个程序猿的遗嘱么?
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 5、React组件事件详解
  • Akka系列(七):Actor持久化之Akka persistence
  • Android交互
  • ES6 ...操作符
  • interface和setter,getter
  • JavaScript函数式编程(一)
  • java多线程
  • mysql innodb 索引使用指南
  • Object.assign方法不能实现深复制
  • PHP 小技巧
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 初识 beanstalkd
  • 多线程事务回滚
  • 力扣(LeetCode)21
  • 全栈开发——Linux
  • 山寨一个 Promise
  • 通过npm或yarn自动生成vue组件
  • 用jQuery怎么做到前后端分离
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .libPaths()设置包加载目录
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net 无限分类
  • .net分布式压力测试工具(Beetle.DT)
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @Bean, @Component, @Configuration简析
  • @GetMapping和@RequestMapping的区别
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [@Controller]4 详解@ModelAttribute
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [2669]2-2 Time类的定义
  • [android学习笔记]学习jni编程
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [CentOs7]iptables防火墙安装与设置