0pts,求调:-(
查看原帖
0pts,求调:-(
588666
Log_Warrior楼主2023/2/18 17:09
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;

int n, m;
int vis[N], low[N], dfn[N], scc[N], val[N], p[N], in[N];
vector<int> E[N], e[N];
stack<int> st;
queue<int> q;
int tt = 0, cnt = 0;

void tarjan(int x) {
	vis[x] = 1;
	st.push(x);
	low[x] = dfn[x] = ++tt;
	for(int i = 0; i < E[x].size(); i++) {
		int v = E[x][i];
		if(!dfn[v]) {
			tarjan(v);
			low[x] = min(low[x], low[v]);
		}
		else if(vis[v]) {
			low[x] = min(low[x], low[v]);
		}
	}
	if(low[x] == dfn[x]) {
		++cnt;
		while(1) {
			int t = st.top();
			st.pop();
			scc[t] = cnt;
			val[cnt] += p[t];
			vis[t] = 0;
			if(t == x) break;
		}
	}
}
int dis[N];
void toposort() {
	for(int i = 1; i <= cnt; i++) {
		if(!in[i] && scc[i]) q.push(i);
		dis[i] = val[i];
	}
	while(!q.empty()) {
		int t = q.front();
		q.pop();
		for(int i = 0; i < e[t].size(); i++) {
			int v = e[t][i];
			if(dis[v] < dis[t] + p[v]) {
				dis[v] = dis[t] + p[v];
			}
			in[v]--;
			if(in[v] == 0) q.push(v);
		}
	}
}

int main() {
	cin >> n >> m;
	for(int i = 1; i <= n; i++) {
		cin >> p[i];
	}
	for(int i = 1; i <= n; i++) {
		int u, v;
		cin >> u >> v;
		E[u].push_back(v);
	}
	for(int i = 1; i <= n; i++) {
		if(!dfn[i]) tarjan(i);
	}
	for(int i = 1; i <= n; i++) {
		for(int j = 0; j < E[i].size(); i++) {
			int u = i, v = E[i][j];
			if(scc[u] != scc[v]) {
				e[scc[u]].push_back(scc[v]);
				in[v]++; 
			}
		}
	}
	toposort();
	int ans = 0;
	for(int i = 1; i <= n; i++) {
		ans = max(ans, dis[i]);
	}
	cout << ans << endl;
	return 0;
} 
2023/2/18 17:09
加载中...