关于此题数据大小
查看原帖
关于此题数据大小
552608
Ask_sum楼主2024/11/28 20:30

经测试,maxnmaxn 必须开到 10510^5 才能避免 RE,但题面的 nn 是满足 n104n \le 10^4(本人因为这个调了半小时)

附代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10, MAXM = 1e5 + 10;
int n, m, head[MAXN], ans, cnt, _head[MAXN], _cnt, a[MAXN], vis[MAXN], low[MAXN], dfn[MAXN], tot, f[MAXN], prt[MAXN], num, c[MAXN], U[MAXN], V[MAXN], in[MAXN];
struct Edge{
	int to, nxt;
}e[MAXM], _e[MAXM];
void add(int u, int v){
	e[++cnt].nxt = head[u];
	head[u] = cnt;
	e[cnt].to = v;
}
void _add(int u, int v){
	_e[++_cnt].nxt = _head[u];
	_head[u] = _cnt;
	_e[_cnt].to = v;
}
stack <int> st;
void tarjan(int u){
	low[u] = dfn[u] = ++tot;
	st.push(u);
	vis[u] = 1;
	for(int i = head[u]; ~i; i = e[i].nxt){
		int v = e[i].to;
		if(!dfn[v]){
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if(vis[v])
			low[u] = min(low[u], dfn[v]);
	}
	if(low[u] == dfn[u]){
		int v;
		do{
			v = st.top();
			st.pop();
			prt[v] = u;
			vis[v] = 0;
			c[u] += a[v];
		}while(v != u);
	}
}
void topo(){
	queue <int> q;
	for(int i = 1; i <= n; i++)
		if(in[i] == 0 && prt[i] == i)
			q.push(i), f[i] = c[i];
	while(!q.empty()){
		int u = q.front();
		q.pop();
		for(int i = _head[u]; ~i; i = _e[i].nxt){
			int v = _e[i].to;
			in[v]--;
			f[v] = max(f[v], f[u] + c[v]);
			if(!in[v])
				q.push(v);
		}
	}
}
int main(){
	memset(head, -1, sizeof(head));
	memset(_head, -1, sizeof(_head));
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i++)
		scanf("%d", a + i);
	for(int i = 1; i <= m; i++){
		scanf("%d %d", U + i, V + i);
		add(U[i], V[i]); 
	}
	for(int i = 1; i <= n; i++)
		if(!dfn[i])
			tarjan(i);
	for(int i = 1; i <= m; i++){
		if(prt[U[i]] != prt[V[i]])
			_add(prt[U[i]], prt[V[i]]), in[prt[V[i]]]++;
	}
	topo();
	for(int i = 1; i <= n; i++)
		ans = max(f[i], ans);
	printf("%d", ans);
	return 0;
}
2024/11/28 20:30
加载中...