9/28B题

传送门~~~
这道题最有意思的地方在于,我们如果能够采用逆向思维,从后向前把图给拆开来,就变得很简单,不用想从前开始的先后顺序了(例如,当前可拆点权值全一样,但下层的点点权影响结果,就有先后顺序了)
所以我们倒过来拆,就只用考虑当前了。(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值