20pts 求助
查看原帖
20pts 求助
982032
XRJprogram楼主2023/10/20 09:08
#include <iostream>
using namespace std;
const int maxn=2*1e4+5;
int n,fa[maxn]={0},value[maxn],Minus[maxn]={0};
//每次更新一个最靠近根节点的负数值,dfs该处
int dfs(int x){
	for(int i=2;i<=n;i++){
		if(fa[i]==x){
			Minus[i]=Minus[x]-value[i];
			dfs(i);
		}
	}
}
int main(){
	cin>>n;
	fa[1]=1;value[1]=0;
	for(int i=1,t;i<=n;i++){
		cin>>t;
		for(int j=1,s,v;j<=t;j++){
			cin>>s>>v;
			if(fa[s]!=i&&fa[i]!=s){
				fa[s]=i;value[s]=v;
			}
		}
	}cin>>Minus[1];
	dfs(1);
	int ans=0;
	for(int minum,minva;;ans++){
		for(int i=1;i<=n;i++){
			minva=~0x3f;
			if(Minus[i]<=0&&Minus[i]>minva){ 
				minum=i;
				minva=Minus[i];
			}
		}if(minva==~0x3f)break;
		Minus[minum]=Minus[1];
		dfs(minum);
	}
	cout<<ans;
}

贪心,每次寻找最靠近根节点的非正数权值并将其设为根节点的权值,同时ans++

2023/10/20 09:08
加载中...