POJ 3249 Test for Job(记忆化搜索)
2013-05-11 14:06
375 查看
题意:
给你一个有向图,每一个节点有一个权值,现在要你从一个入度为0 到一个出度为0的路径,使得权值最大。
思路:
1. 建立反图,于是问题比较清晰:<已知出发状态,未知值> 然后根据边进行记忆化搜索。
2. /article/6649252.html 以前有过总结,用到本题上要保证图是单向的。
给你一个有向图,每一个节点有一个权值,现在要你从一个入度为0 到一个出度为0的路径,使得权值最大。
思路:
1. 建立反图,于是问题比较清晰:<已知出发状态,未知值> 然后根据边进行记忆化搜索。
2. /article/6649252.html 以前有过总结,用到本题上要保证图是单向的。
#include <iostream> #include <vector> #include <stack> #include <algorithm> using namespace std; const int MAXN = 100010; const int INFS = 0x7FFFFFFF; vector<int> G[MAXN]; int F[MAXN], val[MAXN], indeg[MAXN]; int dp(int u) { if (F[u] != -INFS) return F[u]; F[u] = val[u]; int ans = -INFS; for (int i = 0; i < G[u].size(); i++) { int v = G[u][i]; ans = max(ans, dp(v)); } if (ans != -INFS) F[u] += ans; return F[u]; } int main() { int n, m; while (~scanf("%d%d", &n, &m)) { for (int i = 1; i <= n; i++) { scanf("%d", &val[i]); G[i].clear(); F[i] = -INFS, indeg[i] = 0; } while (m--) { int u, v; scanf("%d%d", &u, &v); G[v].push_back(u); indeg[u] += 1; } int ans = -INFS; for (int i = 1; i <= n; i++) if (!indeg[i]) ans = max(ans, dp(i)); printf("%d\n", ans); } return 0; }
相关文章推荐
- POJ3249 Test for Job(记忆化搜索)
- Test for Job (poj 3249 记忆化搜索)
- POJ 3249 Test for Job(DAG上的dp + 记忆化搜索)
- poj 3249 Test for Job 图上dp(记忆化搜索)
- POJ 3249 Test for Job (记忆化搜索 好题)
- Test for Job (poj 3249 记忆化搜索)
- POJ 3249 Test for Job(记忆化搜索)
- poj3249(记忆化搜索)Test for Job
- poj&nbsp;3249&nbsp;Test&nbsp;for&nbsp;Job&nbsp;dp(动态规…
- POJ 3249 Test for Job【SPFA】
- POJ 3249 Test for Job (dfs + dp)
- POJ 3249 Test for Job DAG图上的单源最短路径
- POJ 3249 Test for Job
- POJ_3249 Test for Job(拓扑)
- POJ-3249 Test for Job DAG最短路
- POJ 3249 Test for Job 拓扑排序+DP
- POJ3249 Test for Job(拓扑排序+dp)
- POJ - 3249 Test for Job (DAG+topsort)
- poj 3249 Test for Job (拓扑排序)
- POJ 3249 Test for Job