Tarjan 70pts 求调
查看原帖
Tarjan 70pts 求调
759710
LuoFeng_Nanami楼主2024/3/2 17:00

WA on #7, 8, 9

#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i,a,b) for(rll i=a;i<=b;i++)
#define Fdn(i,a,b) for(rll i=a;i>=b;i--)
#define int ll

using namespace std;

const int inf = 0x3f3f3f3f,mod = 1e9 + 7;
const int maxn = 1e5 + 7;

int n, m;
vector<pair<int, int>> G[maxn], _G[maxn];
int dfn[maxn], low[maxn], col[maxn], InStack[maxn], stk[maxn], DfnClock, SccCnt, TopStack, Siz[maxn], Candy[maxn], InDegree[maxn];

inline void Tarjan(int u) {
	dfn[u] = low[u] = ++DfnClock,
	stk[++TopStack] = u, InStack[u] = 1;
	for(auto tmp : G[u]) {
		int v = tmp.first;
		if(!dfn[v]) {
			Tarjan(v);
			low[u] = min(low[u], low[v]);
		} else if(InStack[v]) 
			low[u] = min(low[u], dfn[v]);
	}
	if(dfn[u] == low[u]) {
		SccCnt++;
		while(stk[TopStack] != u) 
			col[stk[TopStack]] = SccCnt, InStack[stk[TopStack--]] = 0, Siz[SccCnt]++;
		col[u] = SccCnt, InStack[u] = 0, Siz[SccCnt]++, TopStack--;
	}
}



signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	cin >> n >> m;
	F(i, 1, m) {
		int op, u, v; cin >> op >> u >> v;
		if(op == 1) G[u].push_back({v, 0}), G[v].push_back({u, 0});
		else if (op == 2) G[u].push_back({v, 1});
		else if(op == 3) G[v].push_back({u, 0});
		else if(op == 4) G[v].push_back({u, 1});
		else G[u].push_back({u, 0});
	}
	F(i, 1, n) G[0].push_back({i, 1});
	F(i, 0, n) if(!dfn[i]) Tarjan(i);
	F(u, 0, n) {
		for(auto tmp : G[u]) {
			int v = tmp.first, w = tmp.second;
			if(col[u] == col[v] && w == 1) {
				cout << -1;
				exit(0);
			}
			if(col[u] != col[v]) {
				_G[col[u]].push_back({col[v], w});
				InDegree[col[v]] ++;
			}
		}
	}
	queue<int> Q;
	F(i, 1, SccCnt) {
		if(!InDegree[i]) Q.push(i);
	} 
	while(!Q.empty()) {
		int u = Q.front(); Q.pop();
		for(auto tmp : _G[u]) {
			int v = tmp.first, w = tmp.second;
			Candy[v] = max(Candy[v], Candy[u] + w);
			if(!(--InDegree[v])) Q.push(v); 
		}
	}
	int ans = 0;
	F(i, 1, SccCnt) ans += Candy[i] * Siz[i];
	cout << ans;

	return 0;
}
2024/3/2 17:00
加载中...