ARC11B.Reversible Cards 해설 [pyhon]

URL


https://atcoder.jp/contests/arc111/tasks/arc111_b

문제 개요

  • N장의 카드가 있고 양면에 정수가 있는 값
  • 각 카드의 어떤 표를 자유롭게 선택할 수 있을 때 표의 값의 종류 최대치를 구한다
  • 구속


    1 <= N<=2*10^{5}

    코드 커밋


    from collections import deque
    
    n = int(input())
    e = [[] for _ in range(4 * 10 ** 5 + 10)]  # 隣接リスト
    for i in range(n):
        a, b = map(int, input().split())
        a -= 1
        b -= 1
        if a != b:
            e[a].append(b)
        e[b].append(a)
    seen = [-1] * (4 * 10 ** 5)
    # 連結成分に分解して、その中でmin(頂点の個数、辺の個数)を答えにたす
    ans = 0
    q = deque()
    for i in range(4 * 10 ** 5):  # 全頂点:色に対して連結成分を数える
        if seen[i] == -1:
            q.append(i)
            num_e = 0
            num_v = 1
            num_t = 0
            # 1つの連結成分に対して
            while q:
                now = q.popleft()
                seen[now] = 0
                for j in e[now]:
                    num_e += 1
                    if j == now:  # 自己辺
                        num_t += 1
                        continue
                    if seen[j] == -1:
                        q.append(j)
                        seen[j] = 0
                        num_v += 1
            # print(e[i], num_e, num_v, i)
            ans += min((num_t + num_e) // 2, num_v)
    print(ans)
    
    

    고찰하다.

  • 각 값을 정점으로 하고 카드를 연결하는 가장자리를 고려한다
  • 입력은 자체 순환과 다자간 비대화식 도표를 포함하는 것으로 여겨진다
  • 연결성분 이외의 값을 취할 수 없기 때문에 값의 종류수는 연결성분으로 분해할 수 있고, 연결성분에 대해서는 독립적으로 고려할 수 있다
  • 각 연결 성분에 대해 얻을 수 있는 값의 종류를 고려하면 max는 연결 성분 내의 정수리
  • 가 된다.
  • 정점의 수량만 얻을 수 없는 상황이 어떤 상황인지 고려하면 연결성분이 분기와 순환이 없는 path인 상황
  • 만 알 수 있다
  • 증명: 적당한 정점을 기점으로 각 변에 근접한 정점 값을 취하면 분지나 주기가 없으면 가장 먼 정점 이외의 정점을 취할 수 있다
  • 분기나 주기가 있는 경우 이 위치에서 현재 변의 기점에서 먼 정점을 얻을 수 있기 때문에 뒤의 path에 대해 모든 정점을 얻을 수 있다
  • 이루어지다

  • 모든 정점을 순환하고 현재 관찰하지 않은 정점을 BFS로 하여 연결 성분
  • 으로 분해할 수 있다
  • 연결 성분에 대해 계수변의 수량 e와 정점수 v를 계산할 때ans+=min(v, e)으로 답을 구한다
  • 주변이 존재하기 때문에 주변을 제외하고 두 번, 주변을 한 번 세고 두 번으로 나눈 후 정확한 변이 되는 수량
  • 좋은 웹페이지 즐겨찾기