dp[i]表示从i点出发能找到的最长路径
那么对于dp[i]来说,那可以由它的后继节点(拓扑序大的)转移过来:
dp[i] = max(dp[i],dp[t]+val(i,t)) t为所有的后继节点。
这样操作就免去了拓扑排序的这一步骤,而且很显然我们需要用记忆化搜索的方式自顶向下的更新状态。
对于这种边界状态较难枚举的,用自顶向下的方式其实更好实现!!!
ll dp[maxn];
ll find(int x)
{
if( dp[x] != -1 ) return dp[x]; //-1代表当前状态还不可达
for (int i = 0; i < gx[x].size(); i++)
{
int t = gx[x][i].id;
dp[x] = max(dp[x],find(t)+gx[x][i].val);
}
return dp[x];
}