Omówienie zadania Tree Queries (Codeforces) – DFS / PreOrder / PostOrder

Szczegółowe omówienie zadania E. Tree Queries z platformy Codeforces (grafy / DFS / PreOrder / PostOrder):

Link do powyższego omówienia zadania E. Tree Queries:
https://youtu.be/weANP6rubWA


Link do treści zadania E. Tree Queries:
https://codeforces.com/problemset/problem/1328/E


Zadanie E. Tree Queries to zadanie grafowe i wymaga użycia techniki PreOrder / PostOrder.
Te wartości uzyskujemy stosując algorytm DFS.


Zadanie pochodzi z platformy Codeforces – jednej z najpopularniejszych platform algorytmicznych.

Jak się uczyć na podstawie takiego zadania?
https://tiny.pl/7x1gg

Zadanie omawia Mikołaj Bulge.

——-
Kod C++ programu Tree Queries, który jest omówiony w powyższym filmie i który otrzymuje 100%


#include<bits/stdc++.h>
using namespace std;

constexpr int M=2e5+7;

vector<int>g[M];
vector<int>vctr;
int parent[M];
int depth[M];
pair<int,int>prepost[M];
bool was[M];

int tajm=0;

void dfs(int v){
	prepost[v].first=++tajm;
	for(auto w:g[v]){
		if(w==parent[v]) continue;
		parent[w]=v;
		depth[w]=depth[v]+1;
		dfs(w);
	}
	prepost[v].second=++tajm;
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	bool ok;
	int n,q,k,a,b,v;
	
	cin>>n>>q;
	
	for(int i=1; i<n; i++){
		cin>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	
	dfs(1);
	
	while(q--){
		ok=1; v=1;
		
		cin>>k;
		while(k--){
			cin>>a;
			if(a>1) a=parent[a];
			if(depth[a]>depth[v]) v=a;
			vctr.push_back(a);
		}
		
		for(auto w:vctr){
			if(w==v) continue;
			if(!(prepost[w].first<prepost[v].first&&prepost[w].second>prepost[v].second)) ok=0;
		}
		
		vctr.clear();
		
		cout << (ok ? "YES\n" : "NO\n");
	}
	
	return 0;
}
Link do pliku ze wzorcowym kodem C++ zadania Tree Queries 

Nie dodano jeszcze komentarza, rozpocznij dyskusję pierwszy.

Dodaj komentarz