萌新刚Tarjan,求调
查看原帖
萌新刚Tarjan,求调
461359
huangrenheluogu楼主2023/11/25 08:47
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, M = 5e5 + 5;
int n, m, u, v, fir[N][2], nxt[M][2], son[M][2], tot, f[N], g[N], idx, cnt, a[N], val[N], dfn[N], q[N], t, low[N], to[N], deg[N], h, ans, maxn, Max[N];
bool vis[N];
inline void add(int x, int y, int o){
	nxt[++tot][o] = fir[x][o];
	fir[x][o] = tot;
	son[tot][o] = y;
}
inline void tarjan(int x){
	q[++t] = x;
	vis[x] = 1;
	dfn[x] = low[x] = ++idx;
	for(int i = fir[x][0]; i ; i = nxt[i][0]){
		int v = son[i][0];
		if(!dfn[v]){
			tarjan(v);
			low[x] = min(low[x], low[v]);
		}
		else if(vis[v]) low[x] = min(low[x], dfn[v]);
	}
	if(low[x] == dfn[x]){
		cnt++;
		while(vis[x]){
			to[q[t]] = cnt;
			val[cnt] += a[q[t]];
			Max[cnt] = max(Max[cnt], a[q[t]]);
			vis[q[t--]] = 0;
		}
	}
}
inline void topo(){
	t = 0;
	for(int i = 1; i <= cnt; i++){
		if(!deg[i]) q[++t] = i;
		f[i] = val[i];
		g[i] = Max[i];
	}
	while(h < t){
		h++;
		u = q[h];
		if(f[u] > ans){
			ans = f[u];
			maxn = g[u];
		}
		else if(f[u] == ans) maxn = max(maxn, g[u]);
		for(int i = fir[u][1]; i ; i = nxt[i][1]){
			v = son[i][1];
			deg[v]--;
			if(f[v] < f[u] + val[v]){
				f[v] = f[u] + val[v];
				g[v] = max(g[u], Max[v]);
			}
			else if(f[v] == f[u] + val[v]){
				g[v] = max(g[u], g[v]);
			}
			if(deg[v] == 0) q[++t] = v;
		}
	}
}
int main(){
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for(int i = 1; i <= m; i++){
		scanf("%d%d", &u, &v);
		add(u, v, 0);
	}
	for(int i = 1; i <= m; i++){
		if(!dfn[i]) tarjan(i);
	}
	tot = 0;
	for(int i = 1; i <= n; i++){
		for(int j = fir[i][0]; j ; j = nxt[j][0]){
			if(to[i] == to[son[j][0]]) continue ;
			add(to[i], to[son[j][0]], 1);
			deg[to[son[j][0]]]++;
		}
	}
	topo();
	printf("%d %d", ans, maxn);
	return 0;
}
2023/11/25 08:47
加载中...