Cod sursa(job #3337229)

Utilizator stefan_15Salcianu Stefan Alexandru stefan_15 Data 27 ianuarie 2026 04:30:46
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 2.12 kb


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()