tarjan写挂求调……
查看原帖
tarjan写挂求调……
569702
_xxy_楼主2022/10/21 20:52

写得有点乱,看不出tarjan哪里错了,40pts。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
inline int read(){
	int x=0,f=1;
	char ac=getchar();
	while(ac<'0'||ac>'9'){
		if(ac=='-') f=-1;
		ac=getchar();
	}
	while(ac>='0'&&ac<='9'){
		x=(x<<3)+(x<<1)+(ac-'0');
		ac=getchar();
	}
	return x*f;
}
int n,m,cnt,tot,num,now,t[100005],nxt[100005],h[10005],dfn[10005],low[10005],co[10005],r[10005],s[10005],from[100005],sum[10005],a[10005],dp[10005],ans,x[100005],y[100005];
bool vis[10005];
void add(int u,int v){
	t[++cnt]=v;
	from[cnt]=u;
	nxt[cnt]=h[u];
	h[u]=cnt;
}
void tarjan(int u){
	dfn[u]=++now;
	low[u]=dfn[u];
	s[++tot]=u;
	vis[u]=true;
	for(int i=h[u];i;i=nxt[i]){
		if(!dfn[t[i]]){
			tarjan(t[i]);
			low[u]=min(low[u],low[t[i]]);
		}
		else if(vis[t[i]]) low[u]=min(low[u],dfn[t[i]]);
	}
	if(low[u]==dfn[u]){
		num++;
		while(s[tot]!=u){
			sum[num]+=a[s[tot]];
			co[s[tot]]=num;
			vis[s[tot]]=false;
			tot--;
		}
		sum[num]+=a[s[tot]];
		co[s[tot]]=num;
		vis[s[tot]]=false;
		tot--;
	}
}
void tuo(){
	queue<int> q;
	for(int i=1;i<=num;i++){
		if(!r[i]){
			q.push(i); 
			dp[i]=sum[i];
		}
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=h[u];i;i=nxt[i]){
			int v=t[i];
			dp[v]=max(dp[v],dp[u]+sum[v]);
			r[v]--;
			if(!r[v]) q.push(v); 
		}
	}
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=m;i++){
		x[i]=read(),y[i]=read();
		add(x[i],y[i]);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) tarjan(i);
	}
	memset(t,0,sizeof(t));
	memset(from,0,sizeof(from));
	memset(nxt,0,sizeof(nxt));
	memset(h,0,sizeof(h));
	cnt=0;
	for(int i=1;i<=m;i++){
		if(co[x[i]]!=co[y[i]]){
			r[co[x[i]]]++;
			add(co[x[i]],co[y[i]]);
		}
	}
	tuo();
	for(int i=1;i<=num;i++){
		ans=max(ans,dp[i]);
	}
	printf("%d",ans);
	return 0;
} 
2022/10/21 20:52
加载中...