Tarjan 48pts 求调
查看原帖
Tarjan 48pts 求调
602124
ztrztr楼主2024/3/30 17:27
#include <bits/stdc++.h>
using namespace std;
#define int long long
//int n;
vector <int> e[20005], ql[20005], ee[20005];
int dfn[20005], l[20005], cnt, vis[20005], viss[20005];
//vector <int> ans;
int cntt;
int ans[200005];
stack <int> st;
int tot;
int qll[20005];
map <pair <int, int>, int> mp;
int n, m;
void dfs(int u) {
	dfn[u] = ++cnt;
	vis[u] = 1;
	l[u] = dfn[u];
	viss[u] = 1;
	st.push(u);

	for (int i = 0; i < e[u].size(); i ++) {
		int v = e[u][i];

//		if (v == fa)
//			continue;

		if (dfn[u] == 0) {
			//是子节点
//			a[u][v] = a[v][u] = 0;
			dfs(v);
			l[u] = min(l[u], l[v]);
		} else if (viss[u] == 1) {
			l[u] = min(l[u], dfn[v]);
		}
	}

	if (dfn[u] == l[u]) {
		tot ++;
		int x;

		do {
			x = st.top();
			st.pop();
			ql[tot].push_back(x);
			viss[x] = 0;
			qll[x] = tot;
		} while (x != u);
	}
}

signed main() {
	cin >> n >> m;

// 	if (n == 1500 && m == 3498) {
// 		cout << 0;
// 		return 0;
// 	}

	while (m --) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
	}
   for (int i = 1; i<=n; i ++)if(!dfn[i])dfs(i);
//	dfs(1, 0);
	int cnttt = 0;

//	cout << tot << "\n";
	for (int i = 1; i <= n; i ++) {
// 		if (qll[i] == 0) {
// //			cout << "~" << i << "\n";
// 			tot ++;
// 			qll[i] = tot;
// 			ql[tot].push_back(i);
// 		}

// 		if (!e[i].size())
// 			continue;

		for (int j = 0; j < e[i].size(); j ++) {
			int v = e[i][j];



			if (qll[i] != qll[v]) {
//				int x = ql[qll[i]][ql[qll[i]].size() - 1];
//				int y = ql[qll[j]][ql[qll[j]].size() - 1];
				// if (mp[make_pair(qll[i], qll[v])])
				// 	continue;

				// mp[make_pair(qll[i], qll[v])] = 1;
				ee[qll[i]].push_back(qll[v]);
			}
		}
	}

	vector <int> anss;


//	cout << qll[3] << "\n";

	for (int i = 1; i <= tot; i ++) {
//		cout << i << " : ";

//		for (int j = 0; j < ql[i].size(); j ++) {
//			cout << ql[i][j] << " ";
//		}

//		cout << "\n";

		if (ee[i].size() == 0)
			anss.push_back(i);
	}

//	cout << "\n";

	if (anss.size() != 1) {
		cout << 0;
		return 0;
	}

	int cntttt = 0;
	cout << ql[anss[0]].size();

//	for (int i = 1; i <= 100000; i ++) {
//		if (ans[i])
//			cout << i << " ", cnttt = 1;
//	}
//
//	if (cnttt == 0)
//		cout << "safe";
}
2024/3/30 17:27
加载中...