求助,玄关,WA T3
查看原帖
求助,玄关,WA T3
674967
xz001楼主2024/11/1 16:36
#include <bits/stdc++.h>

#define int long long

using namespace std;

const int N = 1e6 + 10;

int n, m, a[N], f[N], dfn[N], low[N], c[N], num, cnt, maxn[N], minn[N];

bool st[N];

vector <int> g[N], b[N];

struct node {
	int u, v, z;
};

node t[N];

stack <int> s;

void tarjan (int u) {
	dfn[u] = low[u] = ++ num;
	s.push(u);
	st[u] = true;
	for (int v : g[u]) {
		if (!dfn[v]) {
			tarjan(v);
			low[u] = min(low[u], low[v]);
		} else if (st[v]) {
			low[u] = min(low[u], dfn[v]);
		}
	}
	if (dfn[u] == low[u]) {
		++ cnt;
		c[u] = cnt;
		maxn[cnt] = minn[cnt] = a[u];
		while (s.top() != u) {
			c[s.top()] = cnt;
			maxn[cnt] = max(maxn[cnt], a[s.top()]);
			minn[cnt] = min(minn[cnt], a[s.top()]);
			st[s.top()] = false;
			s.pop();
		}
		st[s.top()] = false;
		s.pop();
	}
}

int dfs (int u) {
	if (f[u] != -1) return f[u];
	int ans = maxn[u];
	for (int v : b[u])
	    ans = max(ans, dfs(v));
	    
	return f[u] = ans;
}

bool is[N];

void Dfs (int u) {
	is[u] = true;
	for (int v : b[u])
	    if (!is[v])
	        Dfs(v);
	        
	return;
}

signed main() {
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; ++ i ) scanf("%lld", a + i);
    for (int i = 1, u, v, z; i <= m; ++ i ) {
    	scanf("%lld%lld%lld", &u, &v, &z);
    	if (z == 1) g[u].push_back(v);
		else {
			g[u].push_back(v);
			g[v].push_back(u);  
		} 
		t[i] = {u, v, z};
	}
	for (int i = 1; i <= n; ++ i )
	    if (!dfn[i])
	        tarjan(i);
	
	for (int i = 1; i <= m; ++ i ) {
		if (t[i].z == 1) {
			if (c[t[i].u] ^ c[t[i].v]) b[c[t[i].u]].push_back(c[t[i].v]); 
		}
	}
	memset(f, -1, sizeof(f));+
	int ans = 0;
	Dfs(c[1]);
	bool ok = false;
	for (int i = 1; i <= cnt; ++ i )
	    if (is[i])
		    ans = max(ans, dfs(i) - minn[i]);
    
	printf("%lld\n", ans);
	return 0;
}

2024/11/1 16:36
加载中...