flow network (G,c,s,t)는 다음과 같이 정의된다.
주어진 flow network (G,c,s,t)에 대한 s-t flow f는 다음과 같이 정의된다.
이때, flow f의 값은 ∣f∣=∑_(s,v)∈Ef(s,v)−∑_(v,s)∈Ef(v,s)=∑_(v,t)∈Ef(v,t)−∑_(t,v)∈Ef(t,v)로 정의된다.
maximum flow는 주어진 flow network (G,c,s,t)에 대한 s-t flow 중 값이 최대인 s-t flow를 의미한다. 모든 c(e)가 정수라면, 모든 f(e)가 정수인 maximum flow f를 다항 시간에 구할 수 있음이 알려져 있다. 이에 대한 다항 시간 알고리즘의 예시로, 시간 복잡도 O(VE2)의 Edmonds-Karp Algorithm과 시간 복잡도 O(V2E)의 Dinic's Algorithm이 있다.
여기에 추가로 함수 p:E→0,1이 주어진다. 이 때, 우리는 다음 조건을 만족하는 s-t flow f를 parity constraint flow라고 할 것이다.
parity constraint flow 중 값이 최대인 것을 parity constraint maximum flow라고 할 것이다.
flow network (G,c,s,t)와 함수 p가 주어졌을 때, 이에 대한 parity constraint maximum flow를 구해보자.
N과 M은 주어진 그래프 G=(V,E)의 정점의 개수와 간선의 개수를 의미한다
u_i와 v_i는 u_i에서 v_i로 향하는 간선이 있음을 의미하고, c_i와 p_i는 각각 c(u_i,v_i)와 p(u_i,v_i)를 의미한다.
이때, 입력은 다음과 같이 주어진다.
N M s t
u_1 v_1 c_1 p_1
⋯
u_M v_M c_M p_M
첫 번째 줄에는 parity constraint maximum flow f의 값을 출력한다. 만약에 parity constraint flow가 존재하지 않는다면 -1을 출력한다.
만약에 parity constraint flow가 존재한다면, i=1,⋯,M에 대해서 (i+1)번째 줄에 f(u_i,v_i)의 값을 출력한다.
답이 여러 개가 있는 경우, 그중 아무것이나 출력하면 된다.