30分诡异RE求调玄关
查看原帖
30分诡异RE求调玄关
989997
DGL__DGL_AFO楼主2024/9/26 09:44
#include<bits/stdc++.h>
using namespace std;
int n,m;
int h[1145140],ne[1145140],e[1145140],idx;
int w[1145140];
int stk[1145140],st[1145140],op;
int dfn[1145140],low[1145140];
int id[1145140],sid[1145140];
int scnt,tcnt;
int cnt[1145140];
int q[1145140],l,r;
int rr[1145140];
int f[1145140];
int ans;
map<pair<int,int>,int> un;

inline void add(int a,int b)
{
	idx++;
	ne[idx]=h[a];
	e[idx]=b;
	h[a]=idx;
}

inline void tarjan(int x)
{
	//cout<<x<<" ";
	dfn[x]=++tcnt;
	low[x]=tcnt;
	stk[++op]=x;
	st[x]=1;
	
	for(int i=h[x];i;i=ne[i])
	{
		int y=e[i];
		//cout<<y<<' ';
		if(!dfn[y])
		{
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(st[y])
		  low[x]=min(low[x],dfn[y]);	
	}
	
	if(dfn[x]==low[x])
	{
		int y;
		++scnt;
		do{//
			y=stk[op--];//cout<<op<<' ';
			st[y]=0;
			id[y]=scnt;
			sid[scnt]+=w[y];
		} while(y!=x);
	}
}

inline void bfs()
{
	for(int i=1;i<=scnt;i++)
	  if(!rr[i]) 
	    q[r++]=i;
	    
	while(l<=r)
	{
		int x=q[l++];
		//cout<<x<<' ';
		f[x]+=sid[x];
		ans=max(ans,f[x]);
		for(int i=h[x+n];i;i=ne[i])
		{
			int y=e[i]-n;
			f[y]=max(f[y],f[x]);
			rr[y]--;
			if(!rr[y])
				q[r++]=y;
			
		}
	}    
	
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  cin>>w[i];
	  
	for(int i=1;i<=m;i++)
	{
		int a,b;
		cin>>a>>b;
		add(a,b);
	}
	//cout<<1124523<<' ';
	for(int i=1;i<=n;i++)
	  if(!dfn[i])
	    tarjan(i);
	   // cout<<"------------------"<<'\n';
	for(int i=1;i<=n;i++)
	  for(int j=h[i];j;j=ne[j])
		{
			int y=e[j];
 			if(id[i]!=id[y]&&un[make_pair(id[i],id[y])]==0)
			{
				//cout<<id[i]<<' '<<id[y]<<'\n';
				un[make_pair(id[i],id[y])]=1;
				add(id[i]+n,id[y]+n); 
				rr[id[y]]++;
			}		
		}   
	//for(int i=1;i<=n;i++)	
	  //cout<<rr[i]<<' ';
	  //cout<<'\n';
	bfs();
	//cout<<'\n'; 
	//for(int i=1;i<=scnt;i++)
	 // cout<<sid[i]<<' ';
	  //cout<<'\n';
	cout<<ans;
	
	return 0;
} 
2024/9/26 09:44
加载中...