40pts求助(照着模板打的,具有可读性)
查看原帖
40pts求助(照着模板打的,具有可读性)
534025
gmllsswzw楼主2022/10/12 18:12

WA #1 #3 #4 #5 #7 #9

#include<bits/stdc++.h>
#define	MAX_N 10005
#define MAX_M 100005 
using namespace std;
int n,m,a[MAX_N],u,v,ans;
int head[MAX_N],to[MAX_M],Next[MAX_M],tot,hc[MAX_N],toc[MAX_M],nc[MAX_M],tc;
int dfn[MAX_N],low[MAX_N],Stack[MAX_N],top,num,cnt,c[MAX_N],b[MAX_N];
bool ins[MAX_N];
int in[MAX_N],t[MAX_N],sum;
queue<int> q;
int f[MAX_N];
void add_edge(int x,int y){
	to[++tot]=y;
	Next[tot]=head[x];
	head[x]=tot;
}
void addc(int x,int y){
	toc[++tc]=y;
	nc[tc]=hc[x];
	hc[x]=tc;
}
void tarjan(int x){
	dfn[x]=low[x]=++num;
	Stack[++top]=x;	ins[x]=1;
	for(int i=head[x];i;i=Next[i]){
		if(!dfn[to[i]]){
			tarjan(to[i]);
			low[x]=min(low[x],low[to[i]]);
		}
		else	low[x]=min(low[x],dfn[to[i]]);
	}
	if(low[x]==dfn[x]){
		cnt++;
		do{
			int y=Stack[top--];
			b[cnt]+=a[y];
			c[y]=cnt;
			ins[y]=0;
		}while(ins[x]);
	}
}
void topsort(){
	for(int i=1;i<=cnt;i++)
		if(!in[i]){
			q.push(i);
			f[i]=b[i];//顺便初始化 
			ans=max(ans,f[i]);
		}
	while(q.size()){
		int tt=q.front();
		t[++sum]=tt;	q.pop();
		for(int i=hc[tt];i;i=nc[i]){
			in[toc[i]]--;
			if(!in[toc[i]])	q.push(toc[i]);
		}
	}
}
int main(){
	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,&v);
		add_edge(u,v);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])	tarjan(i);
	for(int i=1;i<=n;i++)
		for(int j=head[i];j;j=Next[j]){
			if(c[i]==c[to[i]])	continue;
			addc(c[i],c[to[i]]);
		}
	for(int i=1;i<=cnt;i++)
		for(int j=hc[i];j;j=nc[j])
			in[toc[j]]++;
	topsort();
	for(int i=1;i<=sum;i++)
		for(int j=hc[i];j;j=nc[j]){
			f[toc[j]]=max(f[toc[j]],f[i]+b[toc[j]]);
			ans=max(ans,f[toc[j]]);
		}
	printf("%d",ans);
	return 0;
}
2022/10/12 18:12
加载中...