D

- 题目大意

    给你一个图,求一条起点(入度为0)到终点(出度为0)的路。满足全部点的val之和最大。

- 解题思路

   先用数组记录入度为0和出度为0的点,然后利用记忆化搜索来解决。

- 代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f;
const int N = 1e6 + 10;
long long cnt,sum;
long long d[N], head[N], num[N], vis[N];
struct egde {
	long long u, v, w;
}e[N];

long long dfs(long long u)
{
	if (d[u])
		return d[u];
	long long MAX = -INF;
	for (long long i = head[u]; ~i; i = e[i].w)
	{
		long long v = e[i].v;
		MAX = max(MAX, dfs(v));
	}
	if (MAX== -INF)
		 MAX = 0;
		d[u] =MAX+ num[u];
		return d[u];
}

void addEdge(long long u, long long v)
{
	e[cnt].v = v;
	e[cnt].u = u;
	e[cnt].w = head[u];
	head[u] = cnt++;
}

int main()
{
	long long n, m, a, b;
	while (scanf_s("%lld%lld", &n, &m) != EOF)
	{
		for (long long i = 1; i <= n; i++)
			scanf_s("%lld", &num[i]);
		cnt = 0;
		memset(head, -1, sizeof(head));
		memset(vis, 0, sizeof(head));
		memset(d, 0, sizeof(d));
		for (long long i = 0; i < m; i++)
		{
			scanf_s("%lld%lld", &a, &b);
			addEdge(a, b);
			vis[b]++;
		}
		sum = -INF;
		for (long long i = 1; i <= n; i++)
		{
			if (vis[i] == 0)
				sum = max(sum, dfs(i));
		}
		printf("%lld
", sum);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/alpacadh/p/8449530.html