#P1086. 【模板】强连通分量(Tarjan 缩点)

    ID: 98 传统题 1000ms 256MiB 尝试: 0 已通过: 0难度: 普及+/提高− ← 上一题 下一题 → 随机一题 上传者: 标签 模板题 强连通分量 图论 深度优先搜索 DFS 拓扑排序
显示设置

【模板】强连通分量(Tarjan 缩点)

题目描述

给定一张 nn 个点、mm 条边的有向图,结点编号 1∼n1\sim n。图中可能有重边,也可能有自环。

如果一个点集中的任意两个点都能互相到达,就称这个点集是一个强连通分量(极大强连通子图)。请你求出这张图的强连通分量个数,并给出每个点所属的分量编号。

编号规则:把每个分量中编号最小的点拿出来,按这个最小值从小到大排序,依次编号为 1,2,…,k1,2,\dots,k。

输入格式

第一行两个整数 n,mn,m。

接下来 mm 行,每行两个整数 u,vu,v,表示一条从 uu 指向 vv 的有向边。

输出格式

第一行一个整数 kk,表示强连通分量个数。

第二行 nn 个整数,第 vv 个数表示结点 vv 所属的分量编号。

输入输出样例 #1

输入 #1

5 4
1 2
2 3
3 1
4 5

输出 #1

3
1 1 1 2 3

说明

数据范围

  • 对于 100%100\% 的数据,1≤n≤2×1051\le n\le 2\times 10^5,0≤m≤5×1050\le m\le 5\times 10^5。