제출 #99777

#제출 시각아이디문제언어결과실행 시간메모리
99777shoemakerjo동기화 (JOI13_synchronization)C++14
0 / 100
61 ms14656 KiB
#include <bits/stdc++.h>

using namespace std;

#define maxn 200010

#define pii pair<int, int>

int N, M, Q;

vector<pii> adj[maxn]; //store the node and the value

pii ed[maxn]; //store the edges

bool isin[maxn];
int dj[maxn];

bool canreach[maxn];

void dfs(int u, int p = -1) {
	canreach[u] = true;
	for (pii vp : adj[u]) {
		if (isin[vp.second] && vp.first != p) {
			dfs(vp.first, u);
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> N >> M >> Q;

	int u, v;
	for (int i = 1; i <= N-1; i++) {
		cin >> u >> v;
		adj[u].push_back(pii(v, i));
		adj[v].push_back(pii(u, i));
		ed[i] = pii(u, v);
	}

	for (int i = 1; i <= M; i++) {
		cin >> dj[i];
		isin[dj[i]] ^= true;
	}

	int rt; //the root
	cin >> rt;

	canreach[rt] = true;
	dfs(rt);

	for (int i = M; i >= 1; i--) {
		u = ed[dj[i]].first;
		v = ed[dj[i]].second;

		canreach[u] |= canreach[v];
		canreach[v] |= canreach[u];
	}

	int res = 0;
	for (int i = 1; i <= N; i++) {
		if (canreach[i]) {
			// cout << "    " << i << " reaches " << endl;
			res++;
		}
	}
	cout << res << 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...