传送门~~~
这道题最有意思的地方在于,我们如果能够采用逆向思维,从后向前把图给拆开来,就变得很简单,不用想从前开始的先后顺序了(例如,当前可拆点权值全一样,但下层的点点权影响结果,就有先后顺序了)
所以我们倒过来拆,就只用考虑当前了。(woc,大神们果然nb啊
//B
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Max=4e5+10;
vector<int>g[Max];
struct node{
ll x;
int id;
bool operator <(const node n)const{
return x>n.x;
}
}a[Max];
int indo[Max];
priority_queue<node>q;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
ll n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x;
a[i].id=i;
int num;
cin>>num;
for(int j=1;j<=num;j++){
int temp;
cin>>temp;
g[i].push_back(temp);
indo[temp]++;
}
}
for(int i=1;i<=n;i++){
if(indo[i]==0){
q.push(a[i]);
}
}
ll ans=0;
ll it=n;
while(!q.empty()){
node y=q.top();
q.pop();
it--;
ans=max(ans,y.x+it);
for(int i=0;i<g[y.id].size();i++){
indo[g[y.id][i]]--;
if(indo[g[y.id][i]]==0){
q.push(a[g[y.id][i]]);
}
}
}
cout<<ans<<endl;
return 0;
}