Pagini recente » Cod sursa (job #2265971) | Cod sursa (job #944975) | Borderou de evaluare (job #1596184) | Cod sursa (job #388526) | Cod sursa (job #3337229)
from collections import deque
def solve():
with open("cuplaj.in","r") as f:
n,m,e = map(int, f.readline().strip().split())
total= n+m +1
mat= [[0] * (total +1) for _ in range (total +1)]
S=0
T=n+m+1
adj_list=[[] for _ in range( total +1)]
for i in range(1, n+1):
mat[S][i]=1
adj_list[S].append(i)
adj_list[i].append(S)
for j in range(1, m+1):
# print(j+n)
mat[j+n][T]=1
adj_list[j+n].append(T)
adj_list[T].append(j+n)
with open ("cuplaj.in", "r") as f:
f.readline()
for i in range(e):
x,y = map (int, f.readline().strip().split())
mat[x][y+n]=1
adj_list[x].append(y+n)
adj_list[y+n].append(x)
# for line in mat:
# print(*line)
tata=[-1]*(total +1)
def BFS():
tata[:]=[-1]*(total +1)
tata[S]=-2
q= deque([S])
while q:
curr = q.popleft()
for el in adj_list[curr]:
if tata[el]==-1 and mat[curr][el] >0:
tata[el]= curr
if el ==T:
return True
q.append(el)
return False
max_flow=0
while BFS():
path= float("inf")
curr= T
prev=tata[T]
while prev!=S:
path= min(path, mat[prev][curr])
prev= tata[prev]
curr= tata[curr]
path= min(path, mat[prev][curr])
max_flow+=path
curr= T
prev=tata[T]
while prev!=S:
mat[prev][curr]-=path
mat[curr][prev] += path
prev= tata[prev]
curr= tata[curr]
mat[prev][curr]-=path
mat[curr][prev] += path
with open ("cuplaj.out","w") as f:
f.write(str(max_flow) + '\n')
for i in range (1,n +1):
for el in adj_list[i]:
if n< el < total+1:
if mat[i][el]==0:
f.write(str(i) + " "+ str(el-n) + "\n")
if __name__ == "__main__":
solve()