tarjan 50pts求助
查看原帖
tarjan 50pts求助
701221
Chr0n1CleC楼主2022/10/24 13:38
#include<stdio.h>
#define N 100009
#define M 1000009
#define int long long

int head[N], cnt;

struct node
{
	int v, nxt;
}e[M];

int val[N], sum[N];

bool vis[N];

int col[N], colcnt;

int dfn[N], low[N], dfncnt;

inline int min(int a, int b) {return a < b ? a : b;} 

inline void add(int u, int v)
{
	e[++ cnt].v = v, e[cnt].nxt = head[u], head[u] = cnt;
}

int s[N], top;

void tarjan(int u)
{
	dfn[u] = low[u] = ++ dfncnt;
	vis[u] = 1;
	s[++ top] = u;
	for (register int i = head[u];i;i = e[i].nxt)
	{
		int v = e[i].v;
		if (!dfn[v])
			tarjan(v), low[u] = min(low[u], low[v]);
		else if (vis[v])
			low[u] = min(low[u], dfn[v]);
	}
	if (low[u] == dfn[u])
	{
		++ colcnt;
		while (1)
		{
			int x = s[top];
			vis[x] = 0;
			col[x] = colcnt;
			sum[colcnt] += val[x];
			if (u == x)
				break;
			-- top;
		}
	}
}

int x[N], y[N];

int dp[N];

inline int max(int a, int b)
{
	return a > b ? a : b;
}

int dfs(int u)
{
	if (dp[u])
		return dp[u];
	for (register int i = head[u];i;i = e[i].nxt)
	{
		int v = e[i].v;
		dp[u] = max(dp[u], dp[v]);
	}
	dp[u] += sum[u];
	return dp[u];
}

signed main()
{
	register int n, m;
	scanf("%d%d", &n, &m);
//	puts("114514");
	for (register int i = 1;i <= n;++ i)
		scanf("%lld", &val[i]);
//	puts("114514");
	for (register int i = 1;i <= m;++ i)
		scanf("%d%d", &x[i], &y[i]), add(x[i], y[i]);
//	puts("114514");
	for (register int i = 1;i <= n;++ i)
		if (!dfn[i])
			tarjan(i);
//	puts("114514");
	for (register int i = 1;i <= colcnt;++ i)
		head[i] = 0;//重构图  
	for (register int i = 1;i <= m;++ i)
		if (col[x[i]] != col[y[i]])//保证没有自环 
			add(col[x[i]], col[y[i]]);//加边 
	register int ans = 0;
	for (register int i = 1;i <= colcnt;++ i)
		ans = max(ans, dfs(i));
	printf("%lld", ans);
	
	return 0;
}
2022/10/24 13:38
加载中...