"""G03: Edmonds-Karp with a residual matrix and a min-cut certificate."""fromcollectionsimportdequedefmax_flow(capacity,source,sink):n=len(capacity)ifnot2<=n<=64orany(len(row)!=nforrowincapacity):raiseValueError("square capacity matrix with 2..64 vertices required")ifany(type(c)isnotintorc<0forrowincapacityforcinrow):raiseValueError("nonnegative integer capacities required")if(type(source)isnotintortype(sink)isnotintornot0<=source<nornot0<=sink<norsource==sink):raiseValueError("distinct valid source and sink required")ifany(capacity[i][i]!=0foriinrange(n)):raiseValueError("self-loop capacities must be zero")residual=[list(row)forrowincapacity]value=0whileTrue:parent=[-1]*nparent[source]=sourcetodo=deque([source])whiletodoandparent[sink]==-1:u=todo.popleft()forvinrange(n):ifresidual[u][v]>0andparent[v]==-1:parent[v]=utodo.append(v)ifparent[sink]==-1:reachable={ifori,pinenumerate(parent)ifp!=-1}returnvalue,reachable,residualdelta=Nonev=sinkwhilev!=source:u=parent[v]delta=residual[u][v]ifdeltaisNoneelsemin(delta,residual[u][v])v=uv=sinkwhilev!=source:u=parent[v]residual[u][v]-=deltaresidual[v][u]+=deltav=uvalue+=deltadefcut_capacity(capacity,reachable):returnsum(cforu,rowinenumerate(capacity)forv,cinenumerate(row)ifuinreachableandvnotinreachable)if__name__=="__main__":c=[[0,3,2,0],[0,0,1,2],[0,0,0,3],[0,0,0,0]]value,side,_=max_flow(c,0,3)print(value,sorted(side),cut_capacity(c,side))