tarjan似乎写炸了。。五颜六色的。。。
查看原帖
tarjan似乎写炸了。。五颜六色的。。。
137723
pencil楼主2021/11/2 17:45
#include<iostream>
#include<string.h>
using namespace std;
const int N=10010;
int ne[N],h[N],z[N],idx=0,a[N],n,m,x[N],y[N],d[N];
void add(int a,int b){
	ne[++idx]=h[a];
	h[a]=idx;
	z[idx]=b;
}
int low[N],dfn[N],stck[N],jl=0,num[N],timee=0,top=0;
bool vis[N];
void tarjan(int wz){
	low[wz]=dfn[wz]=++timee;
	vis[wz]=1;
	stck[++top]=wz;
		for(int i=h[wz];i;i=ne[i]){
			if(!vis[z[i]]){
				tarjan(z[i]);
				low[i]=min(low[i],low[z[i]]);
			}
			else{//it has been in
				low[i]=min(low[i],low[z[i]]);
			}
		}
		if(dfn[wz]==low[wz])
		{
//			jl++;
			num[wz]=a[wz];
			while(stck[top]!=wz){
				vis[stck[top]]=0;
				num[jl]+=a[top];
				top--;
			}
		}
}
int  dfs(int wz){
	if(d[wz])
	return d[wz];
	int maxx=-1;
	d[wz]=num[wz];
	for(int i=h[wz];i;i=ne[i]){
		if(!d[z[i]]){
			maxx=max(maxx,dfs(z[i]));
		}
		else
		maxx=max(maxx,d[z[i]]);
	}
	return maxx;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
//		int x,y;
		cin>>x[i]>>y[i];
//		r[y]++;
		add(x[i],y[i]);
	}
	for(int i=1;i<=n;i++)
	tarjan(i);
	memset(ne,0,sizeof(ne));
	memset(h,0,sizeof(h));
	memset(z,0,sizeof(z));
//	memset(vis,0,sizeof(vis));
	int maxx=-1;
//	for(int i=1;i<=jl;i++){
//		maxx=max(maxx,num[i]);
//	}
	for(int i=1;i<=m;i++){
		if(low[x[i]]!=low[y[i]]){
			add(x[i],y[i]);
		}
	}
	for(int i=1;i<=n;i++){
		if(!d[i]){
			maxx=max(maxx,dfs(i));
		}
	}
	cout<<maxx;	
	return 0;
}
2021/11/2 17:45
加载中...