玄学RE求大佬指点
查看原帖
玄学RE求大佬指点
1003901
Angela2022楼主2024/8/21 15:21

N开1e4、1e5都RE,开1e6过了

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=1e4+10,M=1e5+10;
int n,m,dfncnt,scccnt,cnt,ans;
//f[i]:经过i可获得的最大价值 
int val[N],dfn[N],low[N],scc[N],w[N],rd[N],f[N];
bool vis[N],st[N];
vector<int> e[N],ne[N];
stack<int> s;
queue<int> q;
void dfs(int u){
	low[u]=dfn[u]=++dfncnt;
	s.push(u);
	vis[u]=st[u]=1;
	for(auto v:e[u]){
		if(st[v]){
			low[u]=min(low[u],dfn[v]);
		}
		else{
			dfs(v);
			low[u]=min(low[u],low[v]);
		}
	}
	if(low[u]==dfn[u]){
		++scccnt;
		//cout<<u<<" "<<scccnt<<endl;
		//cout<<s.top()<<endl;
		while(!s.empty()){
			int v=s.top();
			scc[v]=scccnt;
			s.pop();
			st[v]=0;
			if(v==u)break;
		}
	}
} 
void toposort(){
	for(int i=1;i<=scccnt;i++){
		if(!rd[i])q.push(i);
		f[i]=w[i];
		ans=max(ans,f[i]);
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(auto v:ne[u]){
			f[v]=max(f[v],f[u]+w[v]);
			ans=max(ans,f[v]);
			rd[v]--;
			if(!rd[v]){
				q.push(v);
			}
		}
	}
	cout<<ans<<endl;
}
int main(){
	cin>>n>>m;
	int u,v;
	for(int i=1;i<=n;i++)cin>>val[i];
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		e[u].pb(v);
	}
	for(int i=1;i<=n;i++){
		if(!vis[i])dfs(i);
	}
	//缩点
	//for(int i=1;i<=n;i++)cout<<scc[i]<<" ";
	//cout<<endl;
	for(int i=1;i<=n;i++){
		w[scc[i]]+=val[i];
		for(auto v:e[i]){
			if(scc[i]!=scc[v]){
			    ne[scc[i]].push_back(scc[v]);
			    rd[scc[v]]++;
			}
		}
	}
	toposort();
	return 0;
}
2024/8/21 15:21
加载中...