제출 #1363521

#제출 시각아이디문제언어결과실행 시간메모리
1363521stanirinaPower Plant (JOI20_power)C++20
100 / 100
130 ms28880 KiB
#include <bits/stdc++.h>

using namespace std;

int n,ans;
vector<vector<int>> g;
vector<bool> gen;
vector<int> dp;

void dfs(int c, int p){
	int s=0;
	for(auto a:g[c]){
		if(a==p)continue;
		dfs(a,c);
		s+=dp[a];
	}
	if(gen[c])dp[c]=max(s-1,1);
	else dp[c]=max(s, 0);
}

void pomeri(int c, int p, int pren){
	int tmp=dp[c];
	int s=0;
	if(p!=-1){
		int tmp2=dp[p];
		int suma=pren-dp[c];
		if(gen[p])dp[p]=max(suma-1,1);
		else dp[p]=max(suma,0);
		for(auto a:g[c])s+=dp[a];
		if(gen[c])dp[c]=max(s-1,1);
		else dp[c]=max(s,0);
		ans=max(ans,dp[c]);
		for(auto a:g[c]){
			if(a==p)continue;
			pomeri(a,c,s);
		}
		dp[c]=tmp;
		dp[p]=tmp2;
	}
	else{
		for(auto a:g[c])s+=dp[a];
		for(auto a:g[c])pomeri(a,c,s);
	}
	
	
}

int main(){
	
	// unesemo, smanjimo sve za po 1, iracunamo br genratora
	
	cin>>n;
	g.resize(n);
	for(int i=0;i<n;i++)g[i].clear();
	for(int i=0;i<n-1;i++){
		int x,y;
		cin>>x>>y;
		x--;y--;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	gen.resize(n);
	string s;
	cin>>s;
	for(int i=0;i<n;i++){
		if(s[i]=='0')gen[i]=false;
		else gen[i]=true;
	}
	int sumaa=0;
	for(int i=0;i<n;i++)sumaa+=gen[i];	
		
	// ako je br jedan ili dva odgovor je jedan ili 2
	
	if(sumaa<=2){
		cout<<sumaa<<endl;
		return 0;
	}
	
	// izracunamo dp za neki cvor kao koren
	
	dp.assign(n,0);
	dfs(0,-1);
	
	//pomeramo koren
	
	ans=dp[0];
	pomeri(0,-1,0);
	cout<<max(ans,2)<<endl;
	
	return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…