tarjan缩点模版都错了还有救吗?
  • 板块P2002 消息扩散
  • 楼主Phrvth
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/29 17:55
  • 上次更新2023/11/3 07:01:53
查看原帖
tarjan缩点模版都错了还有救吗?
520544
Phrvth楼主2023/7/29 17:55

调了一下午了

85pts

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5 + 7;

int n, m, X[MAXN], Y[MAXN];

vector <int> G[MAXN];

void add(int from, int to) {
	G[from].push_back(to);
}
int Low[MAXN], Dfn[MAXN], dfn;

bool V[MAXN];

int Scc[MAXN], scc, In[MAXN], ans;

stack<int> T;

void tarjan(int u) {
	Low[u] = Dfn[u] = ++ dfn;
	T.push(u); V[u] = true;
	for (auto v : G[u]) {
		if (! Dfn[v]) tarjan(v), Low[u] = min(Low[u], Low[v]);
		else if (V[v]) Low[u] = min(Low[u], Low[v]);
	} 
	if (Dfn[u] == Low[u]) {
		Scc[u] = ++ scc;
		while (! T.empty() && T.top() != u) V[T.top()] = 0, Scc[T.top()] = scc, T.pop();
		T.pop(); V[u] = 0;
	} 
}

int main () {
	cin >> n >> m;
	for (int i = 1; i <= m; i ++) {
		cin >> X[i] >> Y[i]; add(X[i], Y[i]);
	}
	for (int i = 1; i <= n; i ++)
		if (!Dfn[i]) tarjan(i);
	for (int i = 1; i <= m; i ++) {
		int u = Scc[X[i]], v = Scc[Y[i]];
		if (u != v) In[v] ++;
	}
	for (int i = 1; i <= scc; i ++) //有向无环图
		if (!In[i]) ans ++;
	cout << ans << '\n';
	return 0;
}
2023/7/29 17:55
加载中...