题目链接
模板题,对于tarjan,如果
dfn[i] == low[i]
时,则已i为根的搜索子树为一个强连通。
ps.大佬博客,讲的非常详细生动。
下面是ac代码:
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
#define INF 0x3f3f3f3f
#define N 200000+10
#define ll long long
using namespace std;
int ver[N], he[N], ne[N];
int n, m, idx = 0, k = 1, Bcnt = 0;
int ins[N], ans = 0, tei;
int dfn[N], low[N];
int Belong[N];
stack<int> s;
int tot = 1;
struct edge
{
int v, next;
}e[N];
void add(int u, int v)
{
e[tot].v = v;
e[tot].next = he[u];
he[u] = tot++;
}
void readdata()
{
int a, b;
memset(he, 0, sizeof(he));
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &a, &b);
add(a, b);
}
}
void tarjan(int u)
{
int v;
dfn[u] = low[u] = ++idx;
s.push(u);
ins[u] = 1;
for (int i = he[u]; i; i = e[i].next)
{
v = e[i].v;
if (!dfn[v])
{
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if (ins[v]) low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u])
{
Bcnt++;
int _cnt = 0;
do
{
v = s.top();
s.pop();
ins[v] = 0;
Belong[v] = Bcnt;
_cnt++;
}while(u != v);
if (ans < _cnt)
{
tei = Bcnt;
ans = _cnt;
}
}
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (c == 1)
{
add(a, b);
}
else
{
add(a, b);
add(b, a);
}
}
for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i);
printf("%d\n", ans);
for (int i = 1; i <= n; i++)
{
if (tei == Belong[i])
printf("%d ", i);
}
printf("\n");
return 0;
}