Submission #3017899


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> Pair;

struct BCC{
    vector<Pair> bridge;
    vector<vector<int>> each_bcc;
    vector<int> cmp;
    stack<int> roots;
    stack<int> S;
    vector<bool> inS;
    vector<int> order;
    int k;

    void visit(int cur, int pre, const vector<int> G[]){
        order[cur] = ++k;
        S.push(cur);
        inS[cur] = true;
        roots.push(cur);

        for(auto to : G[cur]){
            if(order[to] == 0){
                visit(to, cur, G);
            }else if(to != pre && inS[to]){
                while(order[roots.top()] > order[to]) roots.pop();
            }
        }

        if(cur == roots.top()){
            if(pre != -1) bridge.push_back({pre, cur});
            vector<int> bcc;
            while(true){
                int node = S.top();
                S.pop();
                inS[node] = false;
                bcc.push_back(node);
                cmp[node] = each_bcc.size();
                if(node == cur) break;
            }
            each_bcc.push_back(bcc);
            roots.pop();
        }
    }

    void calculate(int N, const vector<int> edges[]){
        order.resize(N, 0);
        inS.resize(N, false);
        cmp.resize(N, 0);
        k = 0;
        for(int i=0; i<N; i++){
            if(order[i] == 0) visit(i, -1, edges);
        }
    }

    int dump_graph(int N, const vector<int> edges[], vector<int> edges2[]){
        for(int i=0; i<N; i++){
            for(auto j : edges[i]){
                if(cmp[i] != cmp[j]){
                    edges2[cmp[i]].push_back(cmp[j]);
                }
            }
        }
        return *max_element(cmp.begin(), cmp.end()) + 1;  
    }
};

struct LCA{
    static const int BITLEN = 30;
    vector<int> parent[BITLEN];
    vector<int> depth;
    int bitlen;

    void initialize(int N, const vector<int> edges[]){
        int root = 0;
        bitlen = 1;
        while((1<<bitlen) < N) bitlen <<= 1;
        for(int i=0; i<bitlen; i++) parent[i].resize(N);
        depth.resize(N, -1);

        dfs(root, -1, 0, edges);
        for(int k=0; k<bitlen-1; k++){
            for(int v=0; v<N; v++){
                if(depth[v] == -1) continue;
                if(parent[k][v] < 0){
                    parent[k+1][v] = -1;
                }else{
                    parent[k+1][v] = parent[k][parent[k][v]];
                }
            }
        }
    }

    void dfs(int v, int p, int d, const vector<int> edges[]){
        parent[0][v] = p;
        depth[v] = d;
        for(auto u : edges[v]){
            if(u != p) dfs(u, v, d+1, edges);
        }
    }

    int lca(int u, int v){
        if(depth[u] > depth[v]) swap(u, v);
        for(int k=0; k<bitlen; k++){
            if( ((depth[v]-depth[u]) >> k) & 1 ) v = parent[k][v];
        }
        if(u == v) return u;
        for(int k=bitlen-1; k>=0; k--){
            if(parent[k][u] != parent[k][v]){
                u = parent[k][u];
                v = parent[k][v];
            }
        }
        return parent[0][u];
    }

    int dist(int u, int v){
        int l = lca(u, v);
        return depth[u] + depth[v] - depth[l]*2;
    }
};

int main(){
    int i, j, k;
    int N, M;
    cin >> N >> M;
    const int MAX = 100000;
    vector<int> edges[MAX];
    for(i=0; i<M; i++){
        int x, y;
        scanf("%d %d", &x, &y);
        edges[x-1].push_back(y-1);
        edges[y-1].push_back(x-1);
    }

    BCC bcc;
    bcc.calculate(N, edges);
    vector<int> edges2[MAX];
    int N2 = bcc.dump_graph(N, edges, edges2);
    LCA lca;
    lca.initialize(N2, edges2);

    int Q;
    cin >> Q;
    for(i=0; i<Q; i++){
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        a = bcc.cmp[a-1];
        b = bcc.cmp[b-1];
        c = bcc.cmp[c-1];
        int d1 = lca.dist(a, c);
        int d2 = lca.dist(a, b) + lca.dist(b, c);
        printf("%s\n", (d1==d2 ? "OK" : "NG"));
    }
    return 0;
}

Submission Info

Submission Time
Task D - 旅行会社高橋君
User betrue12
Language C++14 (GCC 5.4.1)
Score 0
Code Size 4094 Byte
Status TLE
Exec Time 3157 ms
Memory 30628 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:131:31: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &x, &y);
                               ^
./Main.cpp:147:38: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d", &a, &b, &c);
                                      ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 100
Status
AC × 3
AC × 69
TLE × 11
Set Name Test Cases
Sample sample_0.txt, sample_1.txt, sample_2.txt
All bigcycleandsub_0.txt, bigcycleandsub_1.txt, cluster_0.txt, cluster_1.txt, cluster_2.txt, cluster_3.txt, cluster_4.txt, cycleline_0.txt, cycleline_1.txt, cycleline_2.txt, cycleline_3.txt, cycleline_4.txt, cycletree_0.txt, cycletree_1.txt, cycletree_2.txt, cycletree_3.txt, cycletree_4.txt, large_0.txt, large_1.txt, large_2.txt, line_0.txt, line_1.txt, lineandsub_0.txt, lineandsub_1.txt, lineandsub_2.txt, maxrand_0.txt, maxrand_1.txt, maxrand_2.txt, maxrandandsub_0.txt, maxrandandsub_1.txt, maxrandandsub_2.txt, maxrandandsub_3.txt, maxrandandsub_4.txt, med_0.txt, med_1.txt, med_2.txt, med_3.txt, med_4.txt, med_5.txt, med_6.txt, med_7.txt, med_8.txt, med_9.txt, perfect_0.txt, perfect_1.txt, perfect_2.txt, sample_0.txt, sample_1.txt, sample_2.txt, small_0.txt, small_1.txt, small_2.txt, small_3.txt, small_4.txt, small_5.txt, small_6.txt, small_7.txt, small_8.txt, small_9.txt, star_0.txt, star_1.txt, star_2.txt, tencluster_0.txt, tencluster_1.txt, tencluster_2.txt, tencluster_3.txt, tencluster_4.txt, tree_0.txt, tree_1.txt, tree_2.txt, verysmall_0.txt, verysmall_1.txt, verysmall_2.txt, verysmall_3.txt, verysmall_4.txt, verysmall_5.txt, verysmall_6.txt, verysmall_7.txt, verysmall_8.txt, verysmall_9.txt
Case Name Status Exec Time Memory
bigcycleandsub_0.txt AC 81 ms 22616 KB
bigcycleandsub_1.txt AC 81 ms 22616 KB
cluster_0.txt AC 106 ms 11520 KB
cluster_1.txt AC 107 ms 11776 KB
cluster_2.txt AC 105 ms 11392 KB
cluster_3.txt AC 106 ms 11520 KB
cluster_4.txt AC 107 ms 11392 KB
cycleline_0.txt AC 108 ms 11264 KB
cycleline_1.txt AC 108 ms 11136 KB
cycleline_2.txt AC 110 ms 10880 KB
cycleline_3.txt AC 110 ms 11008 KB
cycleline_4.txt AC 109 ms 11264 KB
cycletree_0.txt AC 102 ms 10496 KB
cycletree_1.txt AC 102 ms 10496 KB
cycletree_2.txt AC 102 ms 10496 KB
cycletree_3.txt AC 101 ms 10496 KB
cycletree_4.txt AC 100 ms 10496 KB
large_0.txt AC 94 ms 20032 KB
large_1.txt AC 19 ms 7164 KB
large_2.txt AC 70 ms 19700 KB
line_0.txt TLE 3157 ms 30628 KB
line_1.txt TLE 3157 ms 27936 KB
lineandsub_0.txt TLE 3156 ms 26664 KB
lineandsub_1.txt TLE 3157 ms 29096 KB
lineandsub_2.txt TLE 3157 ms 27812 KB
maxrand_0.txt AC 106 ms 23312 KB
maxrand_1.txt AC 105 ms 23396 KB
maxrand_2.txt AC 107 ms 23388 KB
maxrandandsub_0.txt AC 119 ms 23256 KB
maxrandandsub_1.txt AC 117 ms 23256 KB
maxrandandsub_2.txt AC 118 ms 23256 KB
maxrandandsub_3.txt AC 115 ms 23256 KB
maxrandandsub_4.txt AC 116 ms 23256 KB
med_0.txt AC 4 ms 4992 KB
med_1.txt AC 3 ms 4992 KB
med_2.txt AC 4 ms 4992 KB
med_3.txt AC 3 ms 4992 KB
med_4.txt AC 3 ms 5120 KB
med_5.txt AC 3 ms 4992 KB
med_6.txt AC 3 ms 5120 KB
med_7.txt AC 3 ms 5120 KB
med_8.txt AC 2 ms 4992 KB
med_9.txt AC 3 ms 4992 KB
perfect_0.txt AC 29 ms 6016 KB
perfect_1.txt AC 21 ms 5888 KB
perfect_2.txt AC 29 ms 6016 KB
sample_0.txt AC 3 ms 4992 KB
sample_1.txt AC 3 ms 4992 KB
sample_2.txt AC 3 ms 4992 KB
small_0.txt AC 3 ms 4992 KB
small_1.txt AC 3 ms 4992 KB
small_2.txt AC 2 ms 4992 KB
small_3.txt AC 3 ms 4992 KB
small_4.txt AC 3 ms 4992 KB
small_5.txt AC 3 ms 4992 KB
small_6.txt AC 3 ms 4992 KB
small_7.txt AC 2 ms 4992 KB
small_8.txt AC 3 ms 4992 KB
small_9.txt AC 3 ms 4992 KB
star_0.txt TLE 3156 ms 19048 KB
star_1.txt TLE 3156 ms 19048 KB
star_2.txt TLE 3156 ms 19432 KB
tencluster_0.txt AC 104 ms 13180 KB
tencluster_1.txt AC 101 ms 12540 KB
tencluster_2.txt AC 103 ms 12416 KB
tencluster_3.txt AC 103 ms 13440 KB
tencluster_4.txt AC 103 ms 13312 KB
tree_0.txt TLE 3156 ms 20776 KB
tree_1.txt TLE 3156 ms 20776 KB
tree_2.txt TLE 3156 ms 18472 KB
verysmall_0.txt AC 3 ms 4992 KB
verysmall_1.txt AC 2 ms 4992 KB
verysmall_2.txt AC 3 ms 4992 KB
verysmall_3.txt AC 2 ms 4992 KB
verysmall_4.txt AC 3 ms 4992 KB
verysmall_5.txt AC 2 ms 4992 KB
verysmall_6.txt AC 3 ms 4992 KB
verysmall_7.txt AC 3 ms 4992 KB
verysmall_8.txt AC 2 ms 4992 KB
verysmall_9.txt AC 3 ms 4992 KB