纯萌新,RE?
查看原帖
纯萌新,RE?
368346
小明小红楼主2024/7/15 14:27
#include<bits/stdc++.h> 
using namespace std; 
#define ll long long 
ll n,m,a[200009];
ll vis[100009],sta[100009],low[100009],dfn[100009],top,cnt,sum,color[100009],num[100009],du[100009],siz[100009];
vector<ll>v[200009],v2[200009];
void dfs(ll x)
{
	vis[x]=1,low[x]=++cnt,dfn[x]=cnt;
	sta[++top]=x;
	for(ll i=0;i<v[x].size();i++)
	{
		ll y=v[x][i];
		if(dfn[y]==0)
		{
			dfs(y);
			low[x]=min(low[x],low[y]);
		}
		else if(vis[y]==1)
		{
			low[x]=min(dfn[y],low[x]);
		}
	}
	if(low[x]==dfn[x])
	{
		ll pp=0;
		do{
			pp=sta[top--];
			vis[pp]=0;
			color[pp]=x;
			siz[x]+=a[pp];
		}while(x!=pp);
	}
}
void toposort()
{
	ll dp[10009];
	queue<ll>q;
	memset(dp,0,sizeof(dp));
	for(ll i=1;i<=n;i++)
	{
		if(du[i]==0&&color[i]==i)
		{
			q.push(i);
			dp[i]=siz[i];
		 } 
	}
	while(!q.empty())
	{
		ll u=q.front();
		q.pop();
		for(ll i=0;i<v2[u].size();i++)
		{
			ll o=v2[u][i];
			if(--du[o]==0)
			{
				q.push(o);
			}
			dp[o]=max(dp[o],dp[u]+siz[o]);
		}
	}
	ll ooo=0;
	for(ll i=1;i<=n;i++)
	{
		ooo=max(ooo,dp[i]);
	}
	cout<<ooo;	
}
int main()
{
	ll start[10009],to[10009];
	cin>>n>>m;
	for(ll i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(ll i=1;i<=m;i++)
	{
		ll aa,bb;
		cin>>aa>>bb;
		start[i]=aa,to[i]=bb;
		v[aa].push_back(bb);
	}
	memset(dfn,0,sizeof(dfn));
	for(ll i=1;i<=n;i++)
	{
		if(dfn[i]==0)
		{
			dfs(i);
		}
	}
	for(ll i=1;i<=m;i++)
	{
		ll aa=color[start[i]],bb=color[to[i]];
		if(aa!=bb)
		{
			v2[aa].push_back(bb);
			du[bb]++;
		}
	}
	toposort();	
	return 0;
}
2024/7/15 14:27
加载中...