60分求助
查看原帖
60分求助
120017
JeffZhao楼主2021/7/16 22:26
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>

using namespace std;

const int N = 5e5 + 10;

int n, m, a[N];

int head[N << 1], nx[N << 1], ver[N << 1], idx;
inline void add(int x, int y) {
	ver[idx] = y;
	nx[idx] = head[x]; head[x] = idx++;
	return;
}

int h[N], ne[N], to[N], tot;
inline void Add(int x, int y) {
	to[tot] = y;
	ne[tot] = h[x]; h[x] = tot++;
	return;
}

int dfn[N], low[N], st[N], vis[N], ti, top, kind;
int co[N], p[N], xx[N], yy[N], type[N], Max[N];

inline void tarjan(int u) {
	dfn[u] = low[u] = ++ti;
	st[++top] = u, vis[u] = true;

	for (int i = head[u]; ~i; i = nx[i]) {
		int v = ver[i];
		if (!dfn[v]) {
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if (vis[v])low[u] = min(low[u], dfn[v]);
	}

	if (dfn[u] == low[u]) {
		int v;
		++kind;
		while ((v = st[top--]) != 0) {
			co[v] = kind;
			vis[v] = false;
			p[kind] = min(p[kind], a[v]);
			Max[kind] = max(Max[kind], a[v]);
			if (u == v)break;
		}
	}

	return;
}

queue<int> que;
int d[N], dp[N];

inline int topu(void) {

	for (int i = 1; i <= kind; ++i) {
		if (d[i] == 0) {
			que.push(i), dp[i] = max(0, Max[i] - p[i]);
		}
	}

	while (que.size()) {
		int u = que.front(); que.pop();

		for (int i = h[u]; ~i; i = ne[i]) {
			int v = to[i];
			d[v] --;
			dp[v] = max(dp[u], max(Max[v] - p[v] , 0));
			if (d[v] == 0)que.push(v);
		}
	}
	return dp[co[n]];
}

int main(void) {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	cin >> n >> m;

	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}

	memset(head, -1, sizeof(head));
	memset(h, -1, sizeof(h));

	for (int i = 1; i <= n; ++i) {
		p[i] = (1 << 30), Max[i] = 0;
	}

	for (int i = 1; i <= m; ++i) {
		cin >> xx[i] >> yy[i] >> type[i];
		add(xx[i], yy[i]);
		if (type[i] == 2)add(yy[i], xx[i]);
	}

	for (int i = 1; i <= n; ++i) {
		if (!dfn[i])
			tarjan(i);
	}

	for (int i = 1; i <= m; ++i) {
		int cx = co[xx[i]], cy = co[yy[i]];
		if (cx == cy)continue;
		Add(cx, cy); d[cy] ++;
		if (type[i] == 2)Add(cy, cx), d[cx] ++;
	}

	cout << topu() << endl;
	
	return 0;
}
2021/7/16 22:26
加载中...