码迷,mamicode.com
首页 > 其他好文 > 详细

D - Test for Job (POJ - 3249)

时间:2018-02-15 15:40:02      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:while   name   搜索   cstring   代码   nbsp   ons   inf   test   

- 题目大意

    给你一个图,求一条起点(入度为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\n", sum);
	}
	return 0;
}

  

D - Test for Job (POJ - 3249)

标签:while   name   搜索   cstring   代码   nbsp   ons   inf   test   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!