0分求调,样例已过(必关)
查看原帖
0分求调,样例已过(必关)
1571178
REZ_QWQ楼主2025/6/27 10:14
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+100;
const int M=1e5+100;
int p[N];
int dfn[N],low[N],tot;
int head[N],nxt[M],to[M];
int st[N],top;
bool in[N];
int scc[N],SCC,q[N],fr[M];
int d[N],dp[N];
void dfs(int k){
	dfn[k]=++tot;
	low[k]=dfn[k];
	st[++top]=k;
	st[++top]=k;
	in[k]=true;
	for(int i=head[k];i;i=nxt[i]){
		int v=to[i];
		if(!dfn[v]){
			dfs(v);
			low[k]=min(low[k],low[v]);
		} else
			if(in[v])
				low[k]=min(low[k],low[v]);
	}	
		if(dfn[k]==low[k]){
			in[k]=false;
			scc[k]=++SCC;
			while(st[top]!=k){
				q[SCC]+=p[st[top]];
				scc[st[top]]=SCC;
				in[st[top--]]=false;
			}
				top--;
			}
		}
int main(){
	int n,m,x,y;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%d",p+i);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		fr[i]=x;
		to[i]=y;
		nxt[i]=head[x];
		head[x]=i;
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			dfs(i);
		memset(head,0,sizeof(head));
		for(int i=1;i<=m;i++){
			x=scc[fr[i]];
			y=scc[to[i]];
			if(x==y)
				continue;
			nxt[i]=head[x];
			head[x]=i;
			to[i]=y;
			++d[y];
		}
		queue<int>que;
		for(int i=1;i<=SCC;i++)
		if(!d[i])
		que.push(i);
		int ans=0;;
		while(!que.empty()){
			int k=que.front();
			que.pop();
			dp[k]+=q[k];
			ans=max(ans,dp[k]);
			for(int i=head[k];i;i=nxt[i]){
				dp[to[i]]=max(dp[to[i]],dp[k]);
				if(!--d[to[i]])
					que.push(to[i]);
			}
		}
		cout<<ans<<endl;
	return 0;
}
2025/6/27 10:14
加载中...