Submission #94546

#TimeUsernameProblemLanguageResultExecution timeMemory
94546tpoppoUsmjeri (COCI17_usmjeri)C++14
28 / 140
142 ms41056 KiB
#include <bits/stdc++.h>

using namespace std;
const int MAXN = 3e5 + 10;
const int64_t MOD = 1000000007;


vector<int> grafo[MAXN];
int h[MAXN];
int parent[MAXN];
int in[MAXN];
int out[MAXN];
int dsu[MAXN];


int a,b;
int n,m;

int fast_read_int() {
	int c, n = 0;
	do c = getchar_unlocked();
	while (c < '0' || c > '9' );
	do {
		n = (n << 3) + (n << 1) + (c - '0');
		c = getchar_unlocked();
	} while (c >= '0' && c <= '9');
	return n;
}
inline int find(int x){
    return dsu[x] = dsu[x] == x? x : find(dsu[x]);
}

inline  void merge(int x,int y){
    x = find(x);
    y = find(y);
    if(x == y) return ;

    if(h[x] > h[y]) swap(x,y);
    dsu[y] = x;
}
int cnt;
inline void get_h(int id,int prec,int k=0){
    h[id] = k;
    in[id] = cnt++;
    parent[id] = prec;
    for(auto el : grafo[id]){
        if(el != prec){
            get_h(el,id,k+1);
        }
    }
    out[id] = cnt++;
}

inline bool is_ancestor(int a,int b){
    return in[a] <= in[b] && out[b] <= out[a];
}


int main() {
    n = fast_read_int();
	m = fast_read_int();
    for(int i=0;i<n-1;i++){
        a = fast_read_int();
        b = fast_read_int();
        a--;
        b--;
        grafo[a].push_back(b);
        grafo[b].push_back(a);
    }

    get_h(0,-1);
    //for(int i=0;i<n;i++) cout<<i<<": "<<h[i]<<endl;
    for(int i=0;i<n;i++) dsu[i] = i;

    for(int i=0;i<m;i++){
        a = fast_read_int();
        b = fast_read_int();
        a--;b--;
        if(find(a) == find(b)) continue;


        //cout<<a<<" "<<b<<endl;
        if(is_ancestor(a,b) || is_ancestor(b,a)){
            int ra = a;
            int rb = b;
            a = find(a);
            b = find(b);
            while(a != b){
                if(h[a] < h[b]) swap(a,b);
                if(parent[a] == rb || parent[a] == ra) break;
                merge(a,parent[a]);
                a = find(a);
            }
        }else{
            a = find(a);
            b = find(b);
            while(parent[b] != parent[a] && a != b){
                if(h[a] < h[b]) swap(a,b);
                merge(a,parent[a]);
                a = find(a);
            }
            merge(a,b);
        }
    }
    //for(int i=0;i<dsu.size();i++) cout<<i<<": "<<find(i)<<'\n';

    int rs = 1;
    for(int i=1;i<n;i++){
        if(i == find(i)){
            rs*=2,rs%=MOD;
        }
    }
    printf("%d",rs);


    return 0;
}
#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...