Cod sursa(job #2636561)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 18 iulie 2020 18:05:15
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include<bits/stdc++.h>
using namespace std;

const int NMAX=10005;
const int INF=2000000000;

vector<int> graph[NMAX];

int isPairedU[NMAX],isPairedV[NMAX];
int dmin[NMAX],nrm,n,m,e;

void citire(){
    scanf("%d%d%d", &n, &m, &e);
    for(int i=1;i<=e;i++){
        int x,y;
        scanf("%d%d", &x, &y);
        graph[x].push_back(y);
    }
}

bool BFS(){
    queue<int> Q; ///in Q - noduri nevizitate din U
    for(int i=1;i<=n;i++)
        if(!isPairedU[i]){/// daca nodul i nu este cuplat cu niciun nod din U
            Q.push(i);
            dmin[i]=0;
        }
        else
            dmin[i]=INF;
    dmin[0]=INF;
    while(!Q.empty()){
        int top=Q.front();
        Q.pop();
        if(dmin[top]<dmin[0]){
            for(auto vecin:graph[top])
                if(dmin[isPairedV[vecin]]==INF){/// daca este in matching sdt, ne aflam pe o muchie din match
                    dmin[isPairedV[vecin]]=dmin[top]+1;
                    Q.push(isPairedV[vecin]);
                }
        }
    }
    return dmin[0]!=INF;
}

bool DFS(int x){
    if(x==0)///nodul x face parte din drumul catre un nod nevizitat din U
        return 1;
    for(auto vecin:graph[x])
        if(dmin[isPairedV[vecin]]==dmin[x]+1 && DFS(isPairedV[vecin])){///daca drumul x-v-isPairedV[vecin] a fost parcurs de BFS si ajunge la un nod nevizitat din U
            isPairedU[x]=vecin;
            isPairedV[vecin]=x;
            return 1;
        }
    return 0;
}

void HopcroftKarp(){
    while(BFS()){
        for(int i=1;i<=n;i++)
            if(isPairedU[i]==0 && DFS(i))
                nrm++;
    }
}

int main(){
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d", &n, &m, &e);
    for(int i=1;i<=e;i++){
        int x,y;
        scanf("%d%d", &x, &y);
        graph[x].push_back(y);
    }
    HopcroftKarp();
    printf("%d\n", nrm);
    for(int i=1;i<=n;i++)
        if(isPairedU[i]!=0)
            printf("%d %d\n", i, isPairedU[i]);
    return 0;
}