阅读量:0
模版题。
核心:利用拓扑dp,取前置条件最大值,因为,互不关联的可以同时做,同时做取max
#include<bits/stdc++.h> using namespace std; int n; int t[10010],in[10010],dp[10010],ans; vector<int> g[10010]; void topu(){ vector<int> q; for(int i = 1;i <= n;i++){ if(in[i] == 0){ q.push_back(i); dp[i] = t[i]; } } for(int i = 0;i < q.size();i++){ int u = q[i]; for(int v:g[u]){ dp[v] = max(dp[v],dp[u]+t[v]); in[v]--; if(in[v] == 0){ q.push_back(v); dp[v] = max(dp[v],dp[u]+t[v]); } } } } int main() { cin>>n; for(int i = 1;i <= n;i++){ int id; cin>>id; cin>>t[id]; while(1){ int x; cin>>x; if(x == 0)break; g[x].push_back(id); in[id]++; } } topu(); int ans = 0; for(int i = 1;i <= n;i++){ ans = max(ans,dp[i]); } cout<<ans; return 0; }