建议加强数据
查看原帖
建议加强数据
976798
lsy621楼主2025/7/28 11:41

将遇到回边时更新改为low[x]=min(low[x],low[y]);依然通过测试(100pts)

#include<bits/stdc++.h>
#define N 200010
#define M 200010
using namespace std;
int n,m,cntc,ans,cnte;
int a[N];
int tot,head[N],to[M],nxt[M];
int depth,top,z[N],v[N],in[N],dfn[N],low[N];
int f[N],sum[N],belong[N],indegree[N];
vector<int>scc[N];
struct rec{
	int x,y;
}edge[M];
void add(int x,int y){to[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
void tarjan(int x){
	z[++top]=x,v[x]=1,in[x]=1;
	dfn[x]=low[x]=++depth;
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(!v[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(in[y])low[x]=min(low[x],dfn[y]);//把这里改成lowy(dfn[y] -> low[y])
	}
	if(low[x]==dfn[x]){
		cntc++;
		do{
			scc[cntc].push_back(z[top--]);
			in[scc[cntc].back()]=0;
			sum[cntc]+=a[scc[cntc].back()];
			belong[scc[cntc].back()]=cntc;
		}while(scc[cntc].back()!=x);
	}
}
void topsort(){
	queue<int>q;
	for(int i=1;i<=cntc;i++)if(!indegree[i])q.push(i);
	while(q.size()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=nxt[i]){
			int y=to[i];
			f[y]=max(f[y],f[x]+sum[y]);
			if(!--indegree[y])q.push(y);
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1,x,y;i<=m;i++){
		scanf("%d%d",&x,&y);
		add(x,y);
	}
	for(int i=1;i<=n;i++)if(!v[i])tarjan(i);
	for(int i=1;i<=cntc;i++){
		vector<int>::iterator x;
		for(x=scc[i].begin();x<scc[i].end();x++){
			for(int j=head[*x];j;j=nxt[j]){
				int y=to[j],flag=0;
				vector<int>::iterator z;
				for(z=scc[i].begin();z<scc[i].end();z++){
					if(*z==*x)continue;
					if(*z==y){
						flag=1;
						break;
					}
				}
				if(flag)continue;
				edge[++cnte].x=*x,edge[cnte].y=y;
				indegree[belong[y]]++;
			}
		}
	}
	memset(to,0,sizeof(to));memset(nxt,0,sizeof(nxt));memset(head,0,sizeof(head));
	tot=0;
	for(int i=1;i<=cnte;i++)add(belong[edge[i].x],belong[edge[i].y]);
	for(int i=1;i<=cntc;i++)f[i]=sum[i];
	topsort();
	for(int i=1;i<=cntc;i++)ans=max(ans,f[i]);
	printf("%d",ans);
	return 0;
}
2025/7/28 11:41
加载中...