红绿相间,求助
查看原帖
红绿相间,求助
384064
kevin985楼主2021/12/2 13:09
#include <bits/stdc++.h>
#define N 10013
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
int n,m;
int a[N];

struct Edge{
	int fr,to,nxt;
}edge[N * 10];
int nbs[N],cnt;
inline void add(int u,int v)
{
	edge[++cnt].fr = u;
	edge[cnt].to = v;
	edge[cnt].nxt = nbs[u];
	nbs[u] = cnt;
}
int dfn[N],low[N],t;
bool vis[N];
int stac[N],top;
int sd[N],p[N];
inline void tarjan(int u)
{
	dfn[u] = low[u] = ++t;
	stac[++top] = u;
	vis[u] = 1;
	for(int i=nbs[u];i;i=edge[i].nxt)
	{
		int to = edge[i].to;
		if(!dfn[to])
		{
			tarjan(to);
			low[u] = min(low[u],low[to]);
		}else{
			if(vis[to]) low[u] = min(low[u],dfn[to]);
		}
	}
	if(dfn[u] == low[u])
	{
		int v;
		while(v = stac[top--]) 
		{
			sd[v] = u;
			vis[v] = 0;
			if(u == v) break;
			a[u] += a[v];
		}
	}
}
int head[N],s;
int in[N];
Edge e[N * 10];
inline void connect(int u,int v)
{
	e[++s].to = v;
	e[s].fr = u;
	e[s].nxt = head[v];
	head[u] = s;
	++in[v];
}
int dis[N];
inline void topo()
{
	queue<int>q;
	for(int i=1;i<=n;++i)
	{
		if(sd[i] == i && !in[i])
		{
			q.push(i);
			dis[i] = a[i];
		}
	}
	while(!q.empty())
	{
		int node = q.front();
		q.pop();
		for(int i=head[node];i;i=e[i].nxt)
		{
			int to = e[i].to;
			dis[to] = max(dis[to],dis[node] + a[to]);
			if(--in[to] == 0) q.push(to);
		}
	}
	int ans = 0;
	for(int i=1;i<=n;++i) ans = max(ans,dis[i]);
	printf("%d",ans);
}
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i]);
	for(int i=1;i<=m;++i)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
	}
	for(int i=1;i<=n;++i)
		if(!dfn[i]) tarjan(i);
	for(int i=1;i<=n;++i)
	{
		int u = sd[edge[i].fr],v = sd[edge[i].to];
		if(u != v) connect(u,v);
	}
	topo();
	return 0;
}
2021/12/2 13:09
加载中...