Submission #377744

#TimeUsernameProblemLanguageResultExecution timeMemory
377744peijarMergers (JOI19_mergers)C++17
100 / 100
859 ms106696 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

vector<vector<int>> adj;
vector<int> etat;
vector<vector<int>> dansEtat;
vector<int> profondeur;
vector<int> parent;
vector<int> id;
int nbSommets, nbEtats;

void dfs(int u, int p)
{
	for (auto v : adj[u])
		if (v != p)
		{
			profondeur[v] = profondeur[u] + 1;
			parent[v] = u;
			dfs(v, u);
		}
}

int find(int u)
{
	return id[u] = (u == id[u] ? u : find(id[u]));
}

signed main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	
	cin >> nbSommets >> nbEtats;
	vector<pair<int, int>> aretes;
	id.resize(nbSommets);
	for (int i(0); i < nbSommets; ++i)
		id[i] = i;
	adj.resize(nbSommets);
	etat.resize(nbSommets);
	dansEtat.resize(nbEtats);
	parent.resize(nbSommets);
	profondeur.resize(nbSommets);
	for (int i(1); i < nbSommets; ++i)
	{
		int u, v;
		cin >> u >> v;
		--u, --v;
		aretes.emplace_back(u, v);
		adj[u].push_back(v);
		adj[v].push_back(u);
	}

	for (int i(0); i < nbSommets; ++i)
	{
		cin >> etat[i];
		--etat[i];
		dansEtat[etat[i]].push_back(i);
	}

	dfs(0, 0);

	for (int iEtat(0); iEtat < nbEtats; ++iEtat)
	{
		for (int i(1); i < (int)dansEtat[iEtat].size(); ++i)
		{
			int u = dansEtat[iEtat][i-1], v = dansEtat[iEtat][i];
			u = find(u), v = find(v);
			while (u != v)
			{
				if (profondeur[u] < profondeur[v]) swap(u, v);
				id[u] = find(id[parent[u]]);
				u = id[u];
			}
		}
	}
  
	vector<int> deg(nbSommets);
	for (auto [u, v] : aretes)
	{
		u = find(u), v = find(v);
		if (u != v)
			deg[u]++, deg[v]++;
	}
	int nbFeuilles(0);
	for (auto d : deg)
		nbFeuilles += d == 1;
	int sol = (nbFeuilles + 1)/2;
	cout << sol << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...