WA50#1、3、4、5、7求助
查看原帖
WA50#1、3、4、5、7求助
716260
SegmentTree_楼主2024/6/5 19:58
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define makepair make_pair
#define fir first
#define sec second
const int N = 1e4+5, M = 1e5+5;
int n, m;
int head[N], nxt[M], to[M], cccnnnttt;
int a[N];
int dfn[N], low[N], cnt;
int scc[N], sccsum[N], scctot;
bool vis[N];
stack<int> st;
int ax[M], ay[M];
int dp[N];
void add(int u, int v){
	to[++cccnnnttt] = v;
	nxt[cccnnnttt] = head[u];
	head[u] = cccnnnttt;
}
void dfs(int u){
	dfn[u] = low[u] = ++cnt;
	st.push(u);
	vis[u] = 1;
	for (int i = head[u];i;i = nxt[i]){
		int v = to[i];
		if (!dfn[v]){
			dfs(v);
			low[u] = min(low[u], low[v]);
		}
		else if (vis[v]){
			low[u] = min(low[u], dfn[v]);
		}
	}
	if (dfn[u] == low[u]){
		++scctot;
		while (st.size()){
			int tp = st.top();
			st.pop();
			scc[tp] = scctot;
			sccsum[scctot] += a[tp];
			vis[tp] = 0;
		}
	}
}
void search(int x){
	if (dp[x]) return;
	dp[x] = sccsum[x];
	int mx = 0;
	for (int i = head[x];i;i = nxt[i]){
		int v = to[i];
		if (!dp[v]) search(v);
		mx = max(mx, dp[v]);
	}
	dp[x] += mx;
}
int main(){
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for (int i = 1;i <= n;i++) cin >> a[i];
	for (int i = 1;i <= m;i++){
		int u, v;
		cin >> u >> v;
		ax[i] = u;
		ay[i] = v;
		add(u, v);
	}
	for (int i = 1;i <= n;i++){
		if (!dfn[i]) dfs(i);
	}
	//for (int i = 1;i <= scctot;i++) cout << sccsum[i] << '\n';
	memset(head, 0, sizeof head);
	cccnnnttt = 0;
	for (int i = 1;i <= m;i++){
		if (scc[ax[i]] != scc[ay[i]]){
			add(scc[ax[i]], scc[ay[i]]);
		}
	}
	int ans = 0;
	for (int i = 1;i <= scctot;i++){
		search(i);
		ans = max(ans, dp[i]);
	}
	cout << ans;
	return 0;
}
2024/6/5 19:58
加载中...