蒟蒻求助!!!Tarjan仅50pts,WA了五个点
查看原帖
蒟蒻求助!!!Tarjan仅50pts,WA了五个点
400593
wuyiduo楼主2022/3/2 21:39
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
const int M=1e5+10;
struct edge{
	int v,next;
}e[M];
struct Edge{
	int v,next;
}E[M];
int n,m,val[N],head[N],Head[N],cnt,Cnt,a,b,dfn[N],low[N],tim,filo[N],top,scc[N],d[N],h=1,t,que[N],f[N],ans;
bool in[N];
void add(int u,int v){
	e[++cnt].v=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}
void Add(int u,int v){
	E[++Cnt].v=v;
	E[Cnt].next=Head[u];
	Head[u]=Cnt;
	d[v]++;
}
void dfs(int u){
	dfn[u]=low[u]=++tim;
	filo[++top]=u;
	in[u]=1;
	for(int i=head[u];i;i=e[i].next){
		int to=e[i].v;
		if(!dfn[to]){
			dfs(to);
			low[u]=min(low[u],low[to]);
		}
		else if(in[to]) low[u]=min(low[u],low[to]);
	}
	if(low[u]==dfn[u]){
		while(filo[top]!=u){
			int t=filo[top--];
			val[u]+=val[t];
			scc[t]=u;
			in[t]=0;
		}
		scc[u]=u;
		top--;
		in[u]=0;
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&val[i]);
	while(m--){
		scanf("%d%d",&a,&b);
		add(a,b);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);
	for(int i=1;i<=n;i++)
		for(int j=head[i];j;j=e[j].next)
			if(dfn[i]==low[i]) if(scc[i]!=scc[e[j].v]) Add(i,e[j].v);
	for(int i=1;i<=n;i++){
		if(dfn[i]!=low[i]) continue;
		if(!d[i]) que[++t]=i;
	}
	top=0;
	while(h<=t){
		filo[++top]=que[h];
		for(int i=Head[que[h]];i;i=E[i].next){
			int to=E[i].v;
			d[to]--;
			if(!d[to]) que[++t]=to;
		}
		h++;
	}
	for(int i=top;i>=1;i--){
		for(int j=Head[filo[i]];j;j=E[j].next)
			f[filo[i]]=max(f[filo[i]],f[E[j].v]);
		f[filo[i]]+=val[filo[i]];
		ans=max(ans,f[filo[i]]);
	}
	printf("%d",ans);
	return 0;
}
2022/3/2 21:39
加载中...