该题是让求在一个有向无环图中,从一个入度为 0 的节点出发,到一个出度为 0 的节点的最大的权值问题。我们可以使用广搜,但是会超时,上网查了一下解题报告,可以使用拓扑排序+动态规划来解决此问题:
dp[1] = max{ dp[2] + cost[1] , dp[3] + cost[1] };
dp[2] = cost[2] + dp[4];
dp[3] = cost[3] + dp[4];
dp[4] = cost[4];
dp[5] = cost[5] + dp[6];
dp[6] = cost[6];
在拓扑排序的过程中,是入度为0的节点先入队列,所以我们可以做一个逆置思考,是的 dp[i] 存储的是入度为零的节点到当前节点的最大权值和,而最后在出度为 0 的节点的 dp[i] 中搜索最大的权值。代码实现如下:
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
#define N 100100
#define M 1000100
#define INF 1<<29
struct node
{
int v;
int next;
} edge[M];
int dp[N]; // 最大价值 存储 由 拓扑排序后 入度为0的节点到当前节点最大的 profit
int enext[N]; //记录节点 i 当前的边,由当前的边 推出 下一条边
int ind