Submission #41971496


Source Code Expand

import std;

void read(T...)(string S, ref T args) {
    auto buf = S.split;
    foreach (i, ref arg; args) {
        arg = buf[i].to!(typeof(arg));
    }
}

void read_array(T)(string S, ref T[] arg) {
    arg = S.split.to!(T[]);
}

struct pair {
    int x;
    int y;
}

void main () {
    int N, M; read(readln, N, M);
    auto UF = UnionFind!int();
    foreach (_; 0..M) {
        int u, v; read(readln, u, v);
        UF.merge_group(u, v);
    }

    bool[pair] dont_merge;
    int K; read(readln, K);
    foreach (_; 0..K) {
        int x, y; read(readln, x, y);
        dont_merge[pair(UF.root(x), UF.root(y))] = true;
        dont_merge[pair(UF.root(y), UF.root(x))] = true;
    }

    int Q; read(readln, Q);
    foreach (_; 0..Q) {
        int p, q; read(readln, p, q);
        if (pair(UF.root(p), UF.root(q)) in dont_merge || pair(UF.root(q), UF.root(p)) in dont_merge) {
            writeln("No");
        } else {
            writeln("Yes");
        }
    }
}

struct UnionFind(T) {
    T[T] parent;
    int[T] size;

    // どの要素が一番上の親かを返す。途中経由した頂点もparentの内容がすべて更新される。
    // privateを外しても問題ないが、同一グループ判定にはis_same_group()を使うべき
    T root (T x) {
        if (x !in parent) {
            return x;
        }
        if (parent[x] != x) {
            parent[x] = root(parent[x]);
        }
        return parent[x];
    }

    // 素集合の数を返す。
    int num_of_group () {
        int ret = 0;
        foreach (key, elem; parent) {
            if (key == elem) {
                ret++;
            }
        }
        return ret;
    }

    // 素集合系に要素を(要素数1の集合として)登録する。
    // これをしないと孤立した頂点は系に存在しないものとして扱われ、num_of_group()が正常に動かない。
    // 他の関数は影響を受けない。
    bool register (T x) {
        if (x !in parent) {
            parent[x] = x;
            size[x] = 1;
        }
        return false;
    }

    // 2つの要素が同一集合に属しているかを判定する。
    bool is_same_group (T x, T y) {
        if (x == y) {
            return true;
        }

        if (x !in parent || y !in parent) {
            return false;
        }

        T parx = root(x), pary = root(y);
        return parx == pary;
    }

    // それぞれの要素が属する集合を併合する。
    bool merge_group (T x, T y) {
        if (x == y) {
            return false;
        }

        if (x !in parent) {
            parent[x] = x;
            size[x] = 1;
        }
        if (y !in parent) {
            parent[y] = y;
            size[y] = 1;
        }

        T parx = root(x), pary = root(y);

        if (size[parx] > size[pary]) {
            size[parx] += size[pary];
            parent[pary] = parx;
        } else {
            size[pary] += size[parx];
            parent[parx] = pary;
        }

        return true;
    }

    // 要素が属する集合の要素数を返す。
    int sizeof_group (T x) {
        if (x !in parent) {
            return 1;
        }
        return size[root(x)];
    }
}

Submission Info

Submission Time
Task E - Good Graph
User InTheBloom
Language D (DMD 2.091.0)
Score 475
Code Size 3355 Byte
Status AC
Exec Time 1155 ms
Memory 75124 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 475 / 475
Status
AC × 1
AC × 62
Set Name Test Cases
Sample example0.txt
All 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, 037.txt, 038.txt, 039.txt, 040.txt, 041.txt, 042.txt, 043.txt, 044.txt, 045.txt, 046.txt, 047.txt, 048.txt, 049.txt, 050.txt, 051.txt, 052.txt, 053.txt, 054.txt, 055.txt, 056.txt, 057.txt, 058.txt, 059.txt, 060.txt, example0.txt
Case Name Status Exec Time Memory
000.txt AC 416 ms 36712 KiB
001.txt AC 880 ms 43912 KiB
002.txt AC 957 ms 74984 KiB
003.txt AC 122 ms 4464 KiB
004.txt AC 399 ms 36644 KiB
005.txt AC 638 ms 54744 KiB
006.txt AC 660 ms 24464 KiB
007.txt AC 588 ms 33768 KiB
008.txt AC 853 ms 46696 KiB
009.txt AC 427 ms 45324 KiB
010.txt AC 615 ms 44112 KiB
011.txt AC 731 ms 44224 KiB
012.txt AC 872 ms 44160 KiB
013.txt AC 613 ms 44112 KiB
014.txt AC 843 ms 44024 KiB
015.txt AC 904 ms 44200 KiB
016.txt AC 616 ms 44204 KiB
017.txt AC 617 ms 44084 KiB
018.txt AC 882 ms 44900 KiB
019.txt AC 594 ms 44008 KiB
020.txt AC 851 ms 44180 KiB
021.txt AC 897 ms 44180 KiB
022.txt AC 603 ms 44268 KiB
023.txt AC 768 ms 44192 KiB
024.txt AC 872 ms 44016 KiB
025.txt AC 617 ms 43996 KiB
026.txt AC 617 ms 44160 KiB
027.txt AC 873 ms 44232 KiB
028.txt AC 643 ms 44200 KiB
029.txt AC 854 ms 44716 KiB
030.txt AC 913 ms 44668 KiB
031.txt AC 633 ms 44188 KiB
032.txt AC 755 ms 46740 KiB
033.txt AC 944 ms 46844 KiB
034.txt AC 652 ms 44120 KiB
035.txt AC 685 ms 46880 KiB
036.txt AC 1047 ms 54896 KiB
037.txt AC 642 ms 43988 KiB
038.txt AC 925 ms 54932 KiB
039.txt AC 1077 ms 75008 KiB
040.txt AC 714 ms 44116 KiB
041.txt AC 1060 ms 75012 KiB
042.txt AC 1126 ms 75068 KiB
043.txt AC 722 ms 44020 KiB
044.txt AC 995 ms 74952 KiB
045.txt AC 1070 ms 74980 KiB
046.txt AC 651 ms 44084 KiB
047.txt AC 934 ms 74960 KiB
048.txt AC 1088 ms 75124 KiB
049.txt AC 640 ms 44068 KiB
050.txt AC 751 ms 46808 KiB
051.txt AC 1047 ms 75064 KiB
052.txt AC 659 ms 44204 KiB
053.txt AC 742 ms 43992 KiB
054.txt AC 1155 ms 75112 KiB
055.txt AC 654 ms 44180 KiB
056.txt AC 990 ms 74992 KiB
057.txt AC 1001 ms 74984 KiB
058.txt AC 611 ms 44108 KiB
059.txt AC 849 ms 55032 KiB
060.txt AC 920 ms 74900 KiB
example0.txt AC 2 ms 3460 KiB