728x90
https://www.acmicpc.net/problem/17412
네트워크 플로우 기본 문제입니다.
에드몬드 카프 알고리즘으로 해결했습니다.
import sys
from collections import deque
input = sys.stdin.readline
def solution(N, P, edges):
# 네트워크 플로우
# 1, 2 가 싱크, 소스
# 그래프
graph = [[] for _ in range(N)]
# 흐를 수 있는 유량
flowable = [[0 for _ in range(N)] for __ in range(N)]
for n1, n2 in edges:
# 그래프
graph[n1].append(n2)
graph[n2].append(n1)
# 유량
flowable[n1][n2] = 1
# 경로의 수
cnt = 0
# 순회
while True:
# 데크
dq = deque([0])
# 방문 목록
visited = [-1 for _ in range(N)]
# 우선 경로 탐색 BFS
while dq:
# 싱크에 도달했으면
if 1 in dq:
break
# 현재 노드
now_node = dq.popleft()
# 이동 가능한 노드 탐색
for node in graph[now_node]:
# 방문한 적 없고 이동가능한 유량이 남아있으면
if visited[node] < 0 and flowable[now_node][node]:
# 방문 체크
visited[node] = now_node
# 데크에 추가
dq.append(node)
# 싱크에 도달하지 못했으면
if not dq:
break
# 경로 + 1
cnt += 1
# 경로 추적
route = deque([1])
while route[0] != 0:
# 현재 노드
now_node = route[0]
# 이전 노드
before_node = visited[now_node]
# 경로 추가
route.appendleft(before_node)
# 경로 따라 유량 옮기기
for i in range(len(route)-1):
# 경로
s = route[i]
e = route[i+1]
# 흐를수 있는 유량 업데이트
flowable[s][e] -= 1
flowable[e][s] += 1
print(cnt)
# 입력
N, P = map(int, input().strip().split())
edges = [list(map(lambda x: int(x)-1, input().strip().split())) for _ in range(P)]
solution(N, P, edges)
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 1759 <암호 만들기> Python (0) | 2024.11.11 |
---|---|
백준 16398 <행성 연결> Python (0) | 2024.11.10 |
백준 1916 <최소비용 구하기> Python (0) | 2024.11.08 |
백준 5430 <AC> Python (0) | 2024.11.07 |
백준 2107 <포함하는 구간> Python (0) | 2024.11.07 |