6419 2023. 11. 28 20:46:05 CWM Tom és Jerry 3 cpp17 Elfogadva 50/50 319ms 21864 KiB
#include <iostream>
#include <vector>
#include <unordered_set>
#include <queue>

using namespace std;

int main()
{
    int t;
    cin >> t;
	for (size_t x = 0; x < t; x++)
	{
		int v, tP, jP, k;
		cin >> v >> tP >> jP >> k;
		tP--;
		jP--;
		vector<unordered_set<int>> g(v);
		vector<vector<int>> oldg(v);
		for (size_t i = 0; i < v-1; i++)
		{
			int a, b;
			cin >> a >> b;
			a--; b--;
			g[a].insert(b);
			g[b].insert(a);
			oldg[a].push_back(b);
			oldg[b].push_back(a);
		}
		queue<int> toBeRemoved;
		queue<pair<int,int>> calcMaxDistance;
		int lastRemoved = -1;
		for (size_t i = 0; i < v; i++)
		{
			if (g[i].size() == 1) toBeRemoved.push(i);
		}
		while (!toBeRemoved.empty()) {
			lastRemoved = toBeRemoved.front();
			toBeRemoved.pop();
			if (g[lastRemoved].size() == 0) break;
			int nb = *g[lastRemoved].begin();
			g[nb].erase(lastRemoved);
			if (g[nb].size() == 1) toBeRemoved.push(nb);
		}
		calcMaxDistance.push({ lastRemoved,0 });
		vector<bool> visitedAlready(v);
		int res = 0;
		while (!calcMaxDistance.empty()) {
			pair<int, int> node = calcMaxDistance.front();
			calcMaxDistance.pop();
			visitedAlready[node.first] = true;
			for (size_t i = 0; i < oldg[node.first].size(); i++)
			{
				if (!visitedAlready[oldg[node.first][i]]) {
					calcMaxDistance.push({ oldg[node.first][i], node.second + 1 });
				}
			}
			if (calcMaxDistance.empty()) {
				res = node.second;
			}
		}
		if (res <= k) cout << "IGEN\n";
		else {
			vector<int> tD(v,-1);
			vector<int> jD(v,-1);
			queue<int> mD;
			mD.push(tP);
			tD[tP] = 0;
			while (!mD.empty())
			{
				int nN = mD.front();
				mD.pop();
				for (size_t i = 0; i < oldg[nN].size(); i++)
				{
					if (tD[oldg[nN][i]] == -1) {
						tD[oldg[nN][i]]=tD[nN]+1;
						mD.push(oldg[nN][i]);
					}
				}
			}
			mD.push(jP);
			jD[jP] = 0;
			while (!mD.empty())
			{
				int nN = mD.front();
				mD.pop();
				for (size_t i = 0; i < oldg[nN].size(); i++)
				{
					if (jD[oldg[nN][i]] == -1) {
						jD[oldg[nN][i]] = jD[nN] + 1;
						mD.push(oldg[nN][i]);
					}
				}
			}
			for (size_t i = 0; i < v; i++)
			{
				if (tD[i] <= k || tD[i] - 1 <= jD[i]) {
					if (i == v - 1) {
						cout << "IGEN\n";
					}
					continue;
				}
				else {
					cout << "NEM\n";
					break;
				}
			}
		}
	}
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1952 KiB
2 Elfogadva 0/0 3ms 2124 KiB
3 Elfogadva 5/5 3ms 2300 KiB
4 Elfogadva 1/1 4ms 2412 KiB
5 Elfogadva 1/1 4ms 2460 KiB
6 Elfogadva 1/1 4ms 2444 KiB
7 Elfogadva 1/1 4ms 2704 KiB
8 Elfogadva 1/1 4ms 2776 KiB
9 Elfogadva 1/1 4ms 2656 KiB
10 Elfogadva 1/1 4ms 2916 KiB
11 Elfogadva 2/2 4ms 3128 KiB
12 Elfogadva 2/2 4ms 3204 KiB
13 Elfogadva 1/1 4ms 3416 KiB
14 Elfogadva 2/2 316ms 15360 KiB
15 Elfogadva 2/2 273ms 9676 KiB
16 Elfogadva 2/2 301ms 15596 KiB
17 Elfogadva 2/2 287ms 21644 KiB
18 Elfogadva 2/2 319ms 15752 KiB
19 Elfogadva 2/2 298ms 15708 KiB
20 Elfogadva 2/2 190ms 21716 KiB
21 Elfogadva 2/2 277ms 10272 KiB
22 Elfogadva 2/2 273ms 10188 KiB
23 Elfogadva 3/3 314ms 21828 KiB
24 Elfogadva 2/2 317ms 16200 KiB
25 Elfogadva 3/3 317ms 16188 KiB
26 Elfogadva 2/2 312ms 21864 KiB
27 Elfogadva 2/2 287ms 10276 KiB
28 Elfogadva 3/3 289ms 10456 KiB