90pts WA on#7
查看原帖
90pts WA on#7
952913
oberzhang楼主2024/7/20 11:44
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,m,cnt,dfn[N],low[N],in[N],st[N],top,a[N],dis[N];
vector<int>vec[N],ne[N];
bool stk[10*N];
void dfs(int u,int d){
	dfn[u]=low[u]=++cnt;
	st[++top]=u;
	stk[u]=1;
	for(auto v:vec[u]){
		if(stk[v])low[u]=min(low[u],dfn[v]);
		else if(!dfn[v]){
			dfs(v,u);
			low[u]=min(low[u],low[v]);
		}
	}
	if(dfn[u]==low[u]){
		int y;
		while(y=st[top--]){
			low[y]=u;
			stk[y]=0;
			if(u==y)break;
			a[u]+=a[y];
		}
	}
}
int redfs(){
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			q.push(i);
			dis[i]=a[i];
		}
	}
	int ans=0;
	while(!q.empty()){
		int k=q.front();
		q.pop();
		for(auto v:ne[k]){
			dis[v]=max(dis[v],dis[k]+a[v]);
			in[v]--;
			//ans=max(ans,dis[v]);
			if(in[v]==0)q.push(v);
		}
	}
	for(int i=1;i<=n;i++)ans=max(ans,dis[i]);
	return ans;
}
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;
		vec[u].push_back(v);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			dfs(i,i);
		}
	}
	for(int u=1;u<=n;u++){
		for(auto v:vec[u]){
			if(low[u]!=low[v]){
				ne[low[u]].push_back(low[v]);
				in[low[v]]++;
			}
		}
	}
	cout<<redfs();
	return 0;
}

2024/7/20 11:44
加载中...