40pts,tarjan+tuopu求调,悬关
查看原帖
40pts,tarjan+tuopu求调,悬关
708102
bijhla楼主2023/11/30 15:41

个人猜测是tuopu挂了

#include <bits/stdc++.h>
#define ll long long
#define PII pair<int, int>
#define MP make_pair
using namespace std;
const int N = 1e5 + 10;
struct mystack
{
	int val[N], tp = 0;
	bitset <N> ins;
	inline void push(int x)
	{
		ins[x] = true;
		val[tp++] = x;
	}
	inline void pop()
	{
		ins[val[--tp]] = false;
	}
	inline int top ()
	{
		return val[tp - 1];
	}
}s;
int ver[2 * N], Next[2 * N], head[N], tot;
int ver2[2 * N], Next2[2 * N], head2[N], tot2;
int dfn[N], low[N], c[N], f[N], in[N], ss[N], p[N], dis[N];
int n, m, num, cnt, ans;
queue <int> q;
void add (int x, int y)
{
	ver[++tot] = y, Next[tot] = head[x], head[x] = tot;
}
void add2 (int x, int y)
{
	ver2[++tot2] = y, Next2[tot2] = head2[x], head2[x] = tot2;
}
void tarjan (int x)
{
	dfn[x] = low[x] = ++num;
	s.push (x);
	for (int i = head[x]; i; i = Next[i])
	{
		int y = ver[i];
		if (!dfn[y])
		{
			tarjan (ver[i]);
			low[x] = min (low[x], low[y]);
		}
		else if (s.ins[y])
		{
			low[x] = min (low[x], dfn[y]);
		}
	}
	if (dfn[x] == low[x])
	{
		cnt++;
		int y;
		do
		{
			y = s.top ();
			s.pop ();
			c[y] = cnt;
			p[cnt] += ss[y];
		}
		while (x != y);
	}
}
void tuopu ()
{
	for (int i = 1; i <= cnt; i++)
	{
		f[i] = p[i];
		if (!in[i])
		{
			q.push (i);
		}
	}
	while (!q.empty ())
	{
		int u = q.front ();
		q.pop ();
		for (int i = head2[u]; i; i = Next2[i])
		{
			int v = ver2[i];
			f[v] = max (f[v], f[u] + p[v]);
			in[v]--;
			if (!in[v])q.push (v);
		}
	}
	for (int i = 1; i <= cnt; i++)
	{
		ans = max (f[i], ans);
	}
}
int main ()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> ss[i];
	}
	for (int i = 1; i <= m; i++)
	{
		int x, y;
		cin >> x >> y;
		if (x == y)
		{
			continue;
		}
		add (x, y);
	}
	for (int i = 1; i <= n; i++)
	{
		if (!dfn[i])
		{
			num = 0;
			tarjan (i);
		}
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = head[i]; j; j = Next[j])
		{
			int y = ver[j];
			if (c[i] == c[y]) continue;
			add2 (i, y);
			in[y]++;
		}
	}
	tuopu ();
	cout << ans;
	return 0;
}

2023/11/30 15:41
加载中...