求助 ABC335E
  • 板块学术版
  • 楼主Mr_Biantainne
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/1/7 11:07
  • 上次更新2024/1/7 14:16:27
查看原帖
求助 ABC335E
545601
Mr_Biantainne楼主2024/1/7 11:07

AC\text{AC} ×\times 5858
WA\text{WA} ×\times 3737

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n, m, a[200005], fa[200005], in[200005], ans[200005], u, v;
vector <ll> e[200005];
vector <pair <ll, ll> > rec;
queue <ll> q;
ll find(ll now)
{
	if (fa[now] == now) return now;
	return fa[now] = find(fa[now]);
}
void Union(ll ta, ll tb)
{
	ll ka = find(ta), kb = find(tb);
	if (ka != kb) fa[ka] = kb;
}
int main()
{ 
	cin >> n >> m;
	for (ll i = 1; i <= n; i++) cin >> a[i], fa[i] = i;
	while (m--)
	{
		cin >> u >> v;
		if (a[u] == a[v]) Union(u, v);
		else if (a[u] < a[v]) rec.push_back(make_pair(u, v));
		else rec.push_back(make_pair(v, u));
	}
	for (pair <ll, ll> i : rec) e[find(i.first)].push_back(find(i.second)), in[find(i.second)]++;
	ans[find(1)] = 1;
	q.push(find(1));
	for (ll i = 2; i <= n; i++) if (fa[i] == i && !in[i]) q.push(i);
	while (q.size())
	{
		ll num = q.front();
		q.pop();
		for (ll i = 0; i < e[num].size(); i++)
		{
			ll nxt = e[num][i];
			ans[nxt] = max(ans[nxt], ans[num] + 1);
			in[nxt]--;
			if (!in[nxt]) q.push(nxt);
		}
	}
	cout << ans[find(n)];
}
2024/1/7 11:07
加载中...