这应该是个拓扑排序的模板题,直接放代码
#include <bits/stdc++.h>
using namespace std;
vector<int> vec[10005];
vector<int> vec2[10005];
int t[10005];
int t2[10005];
int rudu[10005];
int flag[10005];
int n;
queue<int> q;
void solve()
{
for(int i=1;i<=n;i++){
if(rudu[i]==0){
q.push(i);
}
}
while(!q.empty()){
int fr=q.front();
flag[fr]=1;
q.pop();
for(int i=0;i<vec[fr].size();i++){
rudu[vec[fr][i]]--;
if(rudu[vec[fr][i]]==0){
//t[vec[fr][i]]+=t[fr];
q.push(vec[fr][i]);
}
for(int j=0;j<vec2[vec[fr][i]].size();j++){
if(flag[vec2[vec[fr][i]][j]]==1){
t2[vec[fr][i]]=max(t2[vec[fr][i]],t2[vec2[vec[fr][i]][j]]+t[vec[fr][i]]);
}
}
}
}
int res=0;
for(int i=1;i<=n;i++){
res=max(res,t2[i]);
}
cout<<res<<endl;
}
int main()
{
cin>>n;
int num;
int tmp;
for(int i=1;i<=n;i++){
cin>>num;
cin>>t[i];
t2[i]=t[i];
while(cin>>tmp&&tmp){
rudu[i]++;
vec[tmp].push_back(i);
vec2[i].push_back(tmp);
}
}
solve();
return 0;
}