Submission #561248

#TimeUsernameProblemLanguageResultExecution timeMemory
561248wiwihoJail (JOI22_jail)C++14
61 / 100
5061 ms263688 KiB
#include <bits/stdc++.h>

#define iter(a) a.begin(), a.end()
#define lsort(a) sort(iter(a))
#define gsort(a) sort(iter(a), greater<>())
#define eb emplace_back
#define pob pop_back()
#define mp make_pair
#define F first
#define S second
#define printv(a, b) { \
    for(auto pv : a) b << pv << " "; \
    b << "\n"; \
}

using namespace std;

typedef long long ll;

using pii = pair<int, int>;
using pll = pair<ll, ll>;

template<typename A, typename B>
ostream& operator<<(ostream& o, pair<A, B> p){
    return o << '(' << p.F << ',' << p.S << ')';
}

int n;
vector<vector<int>> g;
vector<vector<int>> pass;

void init(){
    g.clear();
    g.resize(n + 1);
    pass.clear();
    pass.resize(n + 1);
}

bool dfs(int now, int p, int to, int id){
    if(now == to){
        pass[now].eb(id);
        return true;
    }
    for(int i : g[now]){
        if(i == p) continue;
        if(dfs(i, now, to, id)){
            pass[now].eb(id);
            return true;
        }
    }
    return false;
}

void solve(){
    
    cin >> n;
    init();

    for(int i = 0; i < n - 1; i++){
        int u, v;
        cin >> u >> v;
        g[u].eb(v);
        g[v].eb(u);
    }

    int m;
    cin >> m;
    vector<int> s(m + 1), t(m + 1);
    for(int i = 1; i <= m; i++){
        cin >> s[i] >> t[i];
        dfs(s[i], s[i], t[i], i);
    }

    vector<vector<int>> tg(m + 1);
    vector<int> in(m + 1);
    for(int i = 1; i <= m; i++){
        for(int j : pass[s[i]]){
            if(i == j) continue;
            in[j]++;
            tg[i].eb(j);
        }
        for(int j : pass[t[i]]){
            if(i == j) continue;
            in[i]++;
            tg[j].eb(i);
        }
    }

    queue<int> q;
    for(int i = 1; i <= m; i++){
        if(in[i] == 0) q.push(i);
    }
    int cnt = 0;
    while(!q.empty()){
        int now = q.front();
        q.pop();
        cnt++;
        for(int i : tg[now]){
            in[i]--;
            if(in[i] == 0){
                q.push(i);
            }
        }
    }
    
    if(cnt == m) cout << "Yes\n";
    else cout << "No\n";

}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int T;
    cin >> T;
    while(T--) solve();

    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...