CCF-201509-4-고속도로

9696 단어 CCF
이 문제는 강연통분량을 찾고 그림의 모든 강연통분량을 찾으며 각 분량의 도시 대수를 계산하여 답을 얻어야 한다는 것이 분명하다.도시 쌍을 계산하는 방법은 강연통분량의 결점수*(강연통분량의 결점-1)/2
python 코드:
import sys

sys.setrecursionlimit(10 ** 7)


def tarjan(u):
    global idx
    global bcnt
    idx += 1
    dfn[u] = low[u] = idx
    stack.append(u)
    in_stack[u] = True

    for v in graph[u]:
        if not dfn[v]:
            tarjan(v)  # dfs(v)
            low[u] = min(low[u], low[v])  #   
        elif in_stack[v]:
            low[u] = min(low[u], dfn[v])

    #    ,  dfn[u] == low[u], u      
    if dfn[u] == low[u]:
        sccs[bcnt] = []
        while True:
            v = stack.pop()
            in_stack[v] = False
            sccs[bcnt].append(v)
            if u == v:
                break
        bcnt += 1


n, m = map(int, input().split())
graph = [[] for _ in range(n)]
for i in range(m):
    from_n, to_n = [int(e) - 1 for e in input().split()]
    graph[from_n].append(to_n)

#       ,        ,0      ,  0     
dfn = [0] * n

#        
low = [0] * n

#     
idx = 0

stack = []

#        
in_stack = [False] * n

#       
sccs = {}

#        
bcnt = 0

for i in range(n):
    if not dfn[i]:
        tarjan(i)

ans = 0
for v in sccs.values():
    cnt = len(v)
    ans += int(cnt / 2 * (cnt - 1))
print(ans)

좋은 웹페이지 즐겨찾기