40分,玄关
查看原帖
40分,玄关
632311
huyangmu楼主2024/1/20 19:18
#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 1e5 + 5;
const int NR = 1e4 + 5;
int n,m,dis[N],a[N],b[N],in[NR],fa[NR],dfn[NR],low[NR],dp[NR],cnt,sum,ans = -1;
vector<int> g[NR];
vector<int> G[NR];
bool vis[NR];
stack<int> st;
void Tarjan (int x){
	st.push(x);
	vis[x] = 1;
	++cnt;
	dfn[x] = cnt;
	low[x] = cnt;
	for (int i = 0; i < g[x].size(); ++i){
		int nxt = g[x][i];
		if (dfn[nxt] == 0){
			Tarjan(nxt);
			low[x] = min (low[x], low[nxt]); 
		}else if (vis[nxt] == 1){
			low[x] = min (low[x], low[nxt]);
		}
	}
	if (dfn[x] == low[x]){
		++sum;
		while (st.top() != x && !st.empty()){
			int tmp = st.top(); st.pop();
			fa[tmp] = sum;
			vis[tmp] = 0;
			dis[x] += dis[tmp];
		}
		fa[x] = sum;
		vis[x] = 0;
		st.pop();
	}
	return ;
}
void topo (){
	queue<int> q;
	for (int i = 1; i <= sum; ++i){
		if (in[i] == 0){
			q.push(i);
			dp[i] = dis[i];
		}
	}
	while (!q.empty()){
		int tmp = q.front();
		q.pop();
		for (int i = 0; i < G[tmp].size(); ++i){
			int nxt = G[tmp][i];
			dp[nxt] = max (dp[nxt], dp[tmp] + dis[nxt]);
			--in[nxt];
			if (in[nxt] == 0) q.push(nxt);
		}
	}
	return ;
}
signed main (){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) cin >> dis[i];
	for (int i = 1; i <= m; ++i){
		cin >> a[i] >> b[i];
		g[a[i]].push_back(b[i]);
	}
	for (int i = 1; i <= n; ++i){
		if (dfn[i] == 0) Tarjan(i);
	}
	for (int i = 1; i <= n; ++i){
		int xx = fa[a[i]], yy = fa[b[i]];
		if (xx != yy) {
			G[xx].push_back(yy);
			++in[yy];
		}
	}
	topo();
	for (int i = 1; i <= sum; ++i) ans = max (ans, dp[i]);
	cout << ans << '\n';
	return 0;
}
2024/1/20 19:18
加载中...