Submission #1243433

#TimeUsernameProblemLanguageResultExecution timeMemory
1243433AvianshJail (JOI22_jail)C++20
49 / 100
5093 ms1114112 KiB
#include <bits/stdc++.h>

using namespace std;

unordered_set<int>nodes;
unordered_set<int>fin;
void dfs(int st, vector<int>g[], int p, int t){
    nodes.insert(st);
    if(st==t){
        for(int i : nodes){
            fin.insert(i);
        }
        nodes.erase(st);
        return;
    }
    for(int i : g[st]){
        if(i==p)
            continue;
        if(fin.size())
            break;
        dfs(i,g,st,t);
    }
    nodes.erase(st);
}
bool cyc;
void checkcyc(int st, vector<int>g[], int vis[]){
    vis[st]=1;
    for(int i : g[st]){
        if(vis[i]==1){
            cyc=1;
        }
        if(vis[i])
            continue;
        checkcyc(i,g,vis);
    }
    vis[st]=2;
}

void solve(){
    int n;
    cin >> n;
    vector<int>g[n];
    for(int i = 0;i<n-1;i++){
        int a,b;
        cin >> a >> b;
        a--;b--;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    int m;
    cin >> m;
    int s[m],t[m];
    int revs[n],revt[n];
    fill(revs,revs+n,-1);
    fill(revt,revt+n,-1);
    for(int i = 0;i<m;i++){
        cin >> s[i] >> t[i];
        s[i]--;
        t[i]--;
        revs[s[i]]=i;
        revt[t[i]]=i;
    }
    set<int>path[m];
    fin.clear();
    for(int i = 0;i<m;i++){
        dfs(s[i],g,-1,t[i]);
        for(int j : fin){
            path[i].insert(j);
        }
        fin.clear();
    }
    vector<int>g2[m];
    for(int i = 0;i<m;i++){
        set<int>starts;
        set<int>ends;
        for(int j : path[i]){
            if(!(revs[j]==-1||revs[j]==i)){
                //start point of smth
                starts.insert(revs[j]);
            }
            if(!(revt[j]==-1||revt[j]==i)){
                //end point of smth
                ends.insert(revt[j]);
                if(starts.find(revt[j])!=starts.end()){
                    //both in this path, so bad
                    cout << "No\n";
                    return;
                }
            }
        }
        for(int j : ends){
            g2[i].push_back(j);
        }
        for(int j : starts){
            //j must be before i
            g2[j].push_back(i);
        }
    }
    //now check for cycle.
    cyc=0;
    int vis[m];
    fill(vis,vis+m,0);
    for(int i = 0;i<m;i++){
        if(vis[i]==0){
            checkcyc(i,g2,vis);
        }
    }
    for(bool i : vis){
        if(!i){
            cyc=1;
        }
    }
    if(cyc){
        cout << "No\n";
    }
    else{
        cout << "Yes\n";
    }
}

signed main(){
    ios::sync_with_stdio(0);
    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...