Submission #1241428

#TimeUsernameProblemLanguageResultExecution timeMemory
1241428altern23Usmjeri (COCI17_usmjeri)C++20
0 / 140
463 ms327680 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define pii pair<ll, ll>
#define fi first
#define sec second
#define ld long double

const int MAXN = 5e3;
const ll INF = 1e18;
const int MOD = 1e9 + 7;
const ld eps = 1e-6;

ll d[MAXN + 5];

struct DSU{
	ll N;
	vector<ll> par, sz;
	DSU(ll _n){
		N = _n;
		par.resize(N + 5), sz.resize(N + 5);
		for(int i = 1; i <= N; i++) par[i] = i, sz[i] = 1;
	}
	ll find(ll idx){
		return (par[idx] == idx ? idx : par[idx] = find(par[idx]));
	}
	void join(ll a, ll b){
		a = find(a), b = find(b);
		if(a == b) return;
		if(sz[a] < sz[b]) swap(a, b);
		par[b] = a;
		sz[a] += sz[b];
	}
};

vector<pii> adj[MAXN + 5];
pii up[MAXN + 5][MAXN + 5];
ll dist[MAXN + 5];

void init(ll idx, ll par){
	for(auto [i, j] : adj[idx]){
		if(i != par){
			dist[i] = dist[idx] + 1;
			init(i, idx);
		}
	}
}

void dfs(ll idx, ll par, ll head){
	for(auto [i, j] : adj[idx]){
		if(i != par){
			up[i][head] = {idx, j};
			dfs(i, idx, head);
		}
	}
}

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);		
	int tc = 1;	
	// cin >> tc;
	for(;tc--;){
		ll N, M; cin >> N >> M;
		for(int i = 1; i < N; i++){
			d[i] = -1;
			ll u, v; cin >> u >> v;
			adj[u].push_back({v, i}), adj[v].push_back({u, i});
		}
		DSU dsu(N);
		init(1, -1);
		
		for(int i = 1; i <= N; i++){
			dfs(i, -1, i);
		}
		
		bool ok = 1;
		for(int i = 1; i <= M; i++){
			ll a, b; cin >> a >> b;
			ll tmp = b;
			ll status = -1;
			while(tmp != a){
				if(d[up[tmp][a].sec] != -1){
					if(status != -1 && d[up[tmp][a].sec] != (status ^ (dist[tmp] < dist[up[tmp][a].fi]))){
						ok = 0;
						break;
					}
					status = ((dist[tmp] < dist[up[tmp][a].fi]) != (d[up[tmp][a].sec]));
				}
				tmp = up[tmp][a].fi;
			}
			
			if(status == -1) status = 0;
			tmp = b;
			ll last = -1;
			while(tmp != a){
				d[up[tmp][a].sec] = (status ^ (dist[tmp] < dist[up[tmp][a].fi]));
				if(last == -1) last = up[tmp][a].sec;
				else dsu.join(last, up[tmp][a].sec);
				tmp = up[tmp][a].fi;
			}
		}
		
		if(!ok){
			cout << 0 << "\n";
			continue;
		}
		
		ll ans = 1;
		for(int i = 1; i < N; i++){
			if(dsu.find(i) == i) ans = ans * 2LL % MOD;
		}
		cout << ans << "\n";
	}
}

/*

*/
#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...
#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...