玄关求调
查看原帖
玄关求调
500542
lvyongfeng楼主2024/11/26 19:21
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
inline int read() {
	char c = getchar();
	int res = 0;
	while(c < '0' || c > '9')
		c = getchar();
	while(c >= '0' && c <= '9') {
		res = (res << 1) + (res << 3) + (c ^ 48);
		c = getchar();
	}
	return res;
}
inline void write(int i) {
	if(i > 9)
		write(i / 10);
	putchar((i % 10) + '0');
}
const int N = 1e5 + 5, M = 1e6 + 5;
int n, m, sum, tim, top, s, v;
int p[N], head[N], suo[N], dfn[N], low[N], vis[N], h[N], in[N], dist[N];
stack<int>sta;
struct node{
	int to, next, from;
};
node edge[M], ed[M];
void add(int x,int y){
	edge[++sum].next = head[x];
	edge[sum].from = x;
	edge[sum].to = y;
	head[x] = sum;
}
void tarjan(int x){
	tim++;
	top++;
	low[x] = dfn[x] = tim;
	sta.push(x);
	vis[x] = 1;
	int k = head[x];
	while(k){
		v = edge[k].to;
		if (!dfn[v]) {
			tarjan(v);
			low[x] = min(low[x], low[v]);
		}else if(vis[v]){
	    	low[x] = min(low[x], dfn[v]);
		}
		k = edge[k].next;
	}
	if (dfn[x] == low[x]){
		int t;
		while(t = sta.top()){
			sta.pop();
			suo[t] = x;
			vis[t] = 0;
			if (x == t) break;
			p[x] += p[t];
		}
	}
}
int tp()
{ 
//	for(int i = 1; i <= 1e4; i++)	if(dist[i])cout<<dist[i]<<' ';
//	cout<<endl;
//	for(int i = 1; i <= 1e4; i++)	if(p[i])cout<<p[i]<<' ';
	queue <int> q;
	int tot=0;
	for (int i=1; i<=n;i++){
		if (suo[i]==i && !in[i]){
			q.push(i);
       		dist[i] = p[i];
		}
	}
	while (!q.empty()){
		int k = q.front();
		q.pop();
		//cout<<k<<' ';
		for (int i = h[k]; i; i = ed[i].next){
			int v = ed[i].to;
			dist[v] = max(dist[v], dist[k] + p[v]);
			//cout<<dist[v]<<' ';
			in[v]--;
			if (in[v] == 0) q.push(v);
		}
	}
    int ans = 0;
    for (int i = 1; i <= n; i++){
    	ans = max(ans, dist[i]);
    	//cout<<ans<<' ';
	}
    return ans;
}
int main()
{
	int a, b, x, y;
	n = read();
	m = read();
	for (int i=1;i<=n;i++){
		p[i] = read();
	}
	for (int i=1;i<=m;i++){
		a = read();
		b = read();
		add(a, b);
	}
	for (int i = 1; i <= n; i++){
		if (!dfn[i]){
			tarjan(i);
		}
	}
	for (int i = 1; i <= m;i++){
		x = suo[edge[i].from];
		y = suo[edge[i].to];
		if (x != y){
			s++;
			ed[s].next = h[x];
			ed[s].to = y;
			ed[s].from = x;
			h[x] = s;
			in[y]++;
		}
	}
	write(tp());
	return 0;
}
2024/11/26 19:21
加载中...