Submission #31323318


Source Code Expand

Copy
import sys
def csr(n, E):
start = [0] * (n + 1)
elist = [0] * len(E)
for e in E:
start[e[0] + 1] += 1
for i in range(1, n + 1):
start[i] += start[i - 1]
counter = start[:]
for e0, e1 in E:
elist[counter[e0]] = e1
counter[e0] += 1
return start, elist
class SCC_graph:
def __init__(self, n):
self._n = n
self.edges = []
sys.setrecursionlimit(max(2*n, sys.getrecursionlimit()))
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
import sys


def csr(n, E):
    start = [0] * (n + 1)
    elist = [0] * len(E)
    for e in E:
        start[e[0] + 1] += 1
    for i in range(1, n + 1):
        start[i] += start[i - 1]
    counter = start[:]
    for e0, e1 in E:
        elist[counter[e0]] = e1
        counter[e0] += 1
    return start, elist

class SCC_graph:
    def __init__(self, n):
        self._n = n
        self.edges = []
        sys.setrecursionlimit(max(2*n, sys.getrecursionlimit()))

    def num_vertices(self):
        return self._n

    def add_edge(self, frm, to):
        self.edges.append([frm, to])

    def scc_ids(self):
        start, elist = csr(self._n, self.edges)
        now_ord, group_num = 0, 0
        visited = []
        low = [0] * self._n
        ord_ = [-1] * self._n
        ids = [0] * self._n
        def dfs(v):
            nonlocal now_ord, group_num, visited, low, ord_, ids
            low[v] = ord_[v] = now_ord
            now_ord += 1
            visited.append(v)
            for i in range(start[v], start[v+1]):
                to = elist[i]
                if ord_[to] == -1:
                    dfs(to)
                    if low[to] < low[v]: low[v] = low[to]
                else:
                    if ord_[to] < low[v]: low[v] = ord_[to]
            if low[v] == ord_[v]:
                while True:
                    u = visited.pop()
                    ord_[u] = self._n
                    ids[u] = group_num
                    if u == v: break
                group_num += 1
    
        for i in range(self._n):
            if ord_[i] == -1: dfs(i)
        for i in range(self._n):
            ids[i] = group_num - 1 - ids[i]
    
        return group_num, ids

    def scc(self):
        group_num, ids = self.scc_ids()
        groups = [[] for _ in range(group_num)]
        for i in range(self._n):
            groups[ids[i]].append(i)
        return groups

def main():
    n, m = map(int, input().split())
    scc_graph = SCC_graph(n)
    for _ in range(m):
        a, b = map(int, input().split())
        scc_graph.add_edge(a, b)

    groups = scc_graph.scc()
    n_scc = len(groups)
    print(n_scc)
    for i in range(n_scc):
        g = groups[i]
        print(len(g), ' '.join(map(str, g)))



if __name__ == '__main__':
    main()

Submission Info

Submission Time
Task G - SCC
User Akari__
Language Python (3.8.2)
Score 100
Code Size 2363 Byte
Status AC
Exec Time 3206 ms
Memory 175596 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 1
AC × 11
Set Name Test Cases
Sample example_00
All example_00, max_random_00, max_random_01, max_random_02, max_random_03, max_random_04, random_00, random_01, random_02, random_03, random_04
Case Name Status Exec Time Memory
example_00 AC 22 ms 9336 KB
max_random_00 AC 3206 ms 175564 KB
max_random_01 AC 3194 ms 175460 KB
max_random_02 AC 3185 ms 175596 KB
max_random_03 AC 3155 ms 175524 KB
max_random_04 AC 3196 ms 175392 KB
random_00 AC 2520 ms 142464 KB
random_01 AC 2726 ms 155712 KB
random_02 AC 1277 ms 124964 KB
random_03 AC 1062 ms 91060 KB
random_04 AC 991 ms 74444 KB


2025-04-07 (Mon)
20:44:24 +00:00