제출 #292882

#제출 시각아이디문제언어결과실행 시간메모리
292882limabeansPower Plant (JOI20_power)C++17
6 / 100
1594 ms23936 KiB
#include <bits/stdc++.h>
using namespace std;

template<typename T>
void out(T x) { cout << x << endl; exit(0); }
#define watch(x) cout << (#x) << " is " << (x) << endl





using ll = long long;

const ll mod = 1e9+7;
const int maxn = 1e6 + 5;



int n;
vector<int> g[maxn];
string s;
set<int> broken;
int x,y;
bool dfs(int at, int p) {
    if (at==y) return true;
    for (int to: g[at]) {
	if (to==p) continue;
	if (dfs(to,at)) {
	    if (s[at]=='1' && at!=x) {
		broken.insert(at);
	    }
	    return true;
	}
    }
    return false;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);  cout.tie(0);

    cin>>n;
    for (int i=0; i<n-1; i++) {
	int u,v; cin>>u>>v;
	--u; --v;
	g[u].push_back(v);
	g[v].push_back(u);
    }
    
    cin>>s;

    int best = 0;
    for (int mask=0; mask<1<<n; mask++) {
	vector<int> v;
	bool ok = true;
	for (int j=0; j<n && ok; j++) {
	    if (mask>>j&1) {
		if (s[j]=='0') ok=false;
		v.push_back(j);
	    }
	}
	if (!ok) continue;
	broken.clear();
	for (int i=0; i<int(v.size()); i++) {
	    for (int j=i+1; j<int(v.size()); j++) {
		x=v[i]; y=v[j];
		dfs(v[i],-1);
	    }
	}
	int res = 0;
	for (int x: v) {
	    if (!broken.count(x)) res++;
	}
	res -= int(broken.size());
	best = max(best, res);
    }

    cout<<best<<endl;    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...