문제


https://www.acmicpc.net/problem/2316


풀이


도시 왕복하기 1에서 조건이 추가됐다.

일단 양방향 엣지로 바뀌었고, 각 노드도 최대 1번만 지날 수 있다.

각 노드 u, v에 대해, 새로운 노드 u’, v’을 만들어주고, 단방향 엣지 (u, u’), (v, v’)를 추가한다.

그리고 (u, v) 엣지가 존재하면, 두 단방향 엣지 (u’, v), (v’, u)로 나눠준다.

이렇게 되면 엣지 (u, u’) 때문에 노드 u를 최대 한 번만 지날 수 있다는 제약이 걸린다.


코드


import sys


def dfs(cur):
    if cur == 2:
        return 1
    
    for nxt in range(2, 2 * n + 1):
        if graph[cur][nxt] and not visit[nxt]:            
            visit[nxt] = 1
            if dfs(nxt):
                graph[cur][nxt] = 0
                graph[nxt][cur] = 1
                return 1
    
    return 0


n, m = map(int, sys.stdin.readline().split())
graph = [[0] * (2 * n + 1) for _ in range(2 * n + 1)]

for i in range(1, n + 1):
    graph[i][i + n] = 1

for _ in range(m):
    start, end = map(int, sys.stdin.readline().split())
    graph[start + n][end] = 1
    graph[end + n][start] = 1

ans = 0
flow = 1
while flow:
    visit = [0] * (2 * n + 1)
    flow = dfs(1 + n)
    ans += flow

print(ans)

Leave a comment