70pts
查看原帖
70pts
695863
Prolystic楼主2024/8/9 20:57

WA on #2 #7 #8

#include <bits/stdc++.h>
using namespace std;
namespace Prulystic { void Main(); }
int main(){
    Prulystic::Main();
    return 0;
}
namespace Prulystic{
    const int N = 2e4 + 5;
    using graph = vector<int>;
    int n, m, q, dfc, vdcc_idx, top;
    int dfn[N], low[N], stk[N], dpt[N], fa[N][16];
    graph g[N], t[N << 1];
    inline void add(graph grp[], int u, int v){
        grp[u].push_back(v),
        grp[v].push_back(u);
    }
    inline void vdcc(int u){
        dfn[u] = low[u] = ++dfc;
        stk[++top] = u;
        for(int v : g[u]){
            if(!dfn[v]){
                vdcc(v);
                low[u] = min(low[u], low[v]);
                if(low[v] >= dfn[u]){
                    vdcc_idx++;
                    int tmp;
                    do{
                        tmp = stk[top--];
                        add(t, vdcc_idx, tmp);
                    }while(tmp != v);
                    add(t, vdcc_idx, u);
                }
            }else
                low[u] = min(low[u], dfn[v]);
        }
    }
    inline void init(int u, int f){
        fa[u][0] = f, dpt[u] = dpt[f] + 1;
        for(int i = 0; i < 15; i++)
            fa[u][i + 1] = fa[fa[u][i]][i];
        for(int v : t[u])
            if(v != f)
                init(v, u);
    }
    inline int getLca(int u, int v){
        if(dpt[u] > dpt[v])
            swap(u, v);
        for(int i = 15; i >= 0; i--)
            if(dpt[fa[v][i]] >= dpt[u])
                v = fa[v][i];
        if(u == v)
            return u;
        for(int i = 15; i >= 0; i--)
            if(fa[u][i] != fa[v][i])
                u = fa[u][i], v = fa[v][i];
        return fa[u][0];
    }
    inline bool judge(int u, int v, int w){
        if(getLca(u, w) == w || getLca(v, w) == w)
            return true;
        return false;
    }
    inline void read(int& x){
        int s = 0, w = 1;
        char ch = getchar();
        while(!isdigit(ch)) { w = (ch == '-' ? -1 : 1); ch = getchar(); }
        while(isdigit(ch)) { s = s * 10 + ch - '0'; ch = getchar(); }
        x = s * w;
    }
    void Main(){
        read(n), read(m);
        vdcc_idx = n;
        for(int i = 1; i <= m; i++){
            int u, v; read(u), read(v);
            add(g, u, v);
        }
        for(int u = 1; u <= n; u++)
            if(!dfn[u])
                vdcc(u);
        init(1, 0);
        read(q);
        while(q--){
            int u, v, w; read(u), read(v), read(w);
            int lca = getLca(u, v);
            if(dpt[w] < dpt[lca])
                printf("no\n");
            else{
                if(judge(u, v, w))
                    printf("yes\n");
                else
                    printf("no\n");
            }
        }
    }
}
2024/8/9 20:57
加载中...