본문 바로가기
알고리즘

백준_6086_최대 유량

by 매화of사군자 2020. 1. 23.

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

 

6086번: 최대 유량

문제 농사꾼 존은 소들이 충분한 물을 마시길 원했다. 그래서 농장에서 우물에서 외양간을 잇는 N개의 배수관의 지도를 만들기로 했다. 존은 아주 다양한 크기의 배수관들이 완전히 우연한 방법으로 연결돼있음을 알았다. 존은 파이프를 통과하는 유량을 계산하고 싶다. 두개의 배수관이 한줄로 연결 돼 있을 때 두 관의 유량 중 최솟값으로 흐르게 된다. 예를 들어 용량이 5인 파이프가 용량이 3인 파이프와 연결되면 한개의 용량 3짜리 파이프가 된다. +---5---+

www.acmicpc.net

해결 방법

> 포드 풀커슨 알고리즘을 이용한다.

 

코드

더보기

import sys

from collections import defaultdict, deque

 

input = sys.stdin.readline

pipe = defaultdict(lambda:defaultdict(int))

 

num = int(input())

 

#그래프 입력

for i in range(num):

    one, two, flow = map(strinput().split())

    pipe[one][two] += int(flow)

    pipe[two][one] += int(flow)

 

def bfs(startsinkparent):

    visited = defaultdict(lambda:0)

    queue = deque()

    queue.append(start)

    visited[start] = 1

    while queue:

        u = queue.popleft()

        for i in pipe[u]:

            val = pipe[u][i]

            if visited[i]:

                continue

            if val <= 0:

                continue

            queue.append(i)

            visited[i] = 1

            parent[i] = u

    return 1 if visited[sink] else 0

 

def ford_fulkerson(startsink):

    parent = defaultdict(lambda : -1)

    max_flow = 0

    while bfs(start, sink, parent):

        path_flow = float('inf')

        s = sink

        while s!= start:

            path_flow = min(path_flow, pipe[parent[s]][s])

            s = parent[s]

        max_flow += path_flow

        v = sink

        while v != start:

            u = parent[v]

            pipe[u][v] -= path_flow

            pipe[v][u] += path_flow

            v = parent[v]

    return max_flow

 

print(ford_fulkerson('A','Z'))

'알고리즘' 카테고리의 다른 글

백준_5567_결혼식  (0) 2020.01.28
백준_1671_상어의 저녁식사  (0) 2020.01.26
백준_1671_상어의 저녁식사(못풀었음)  (0) 2020.01.22
백준_11404_플로이드  (0) 2020.01.21
백준_4963_섬의 개수  (0) 2020.01.20

댓글