Cod sursa(job #2230713)

Utilizator danielsociuSociu Daniel danielsociu Data 11 august 2018 08:48:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>
std::ifstream cin("cuplaj.in");
std::ofstream cout("cuplaj.out");
#define maxn 10005
#define FORI(i,g) for(std::vector <int>::iterator i=(g).begin();i!=(g).end();i++)
int N,M,E;
std::vector <int>G[maxn];
int L[maxn],R[maxn],viz[maxn];

int HopcroftKarp(const int x){
    if(viz[x]) return 0;//ca sa nu fie loop infinit, viz se reseteaza dupa o schimbare in main
    viz[x]=1;
    FORI(i,G[x])
        if(!R[*i]){
            R[*i]=x;
            L[x]=*i;
            return 1;
        }
    FORI(i,G[x])
        if(HopcroftKarp(R[*i])){ //HopcroftKarp(R[*i]) e defapt o val de pe L(stenga)
            R[*i]=x;        //si va cauta o alta val pt acesta,
            L[x]=*i;        //iar R[*i] se va elibera pt x ul nostru
            return 1;
        }
    return 0;
}

int main()
{
    int x,y,counter=0;
    cin>>N>>M>>E;
    for(;E--;){
        cin>>x>>y;
        G[x].push_back(y);
    }
    for(int change=1;change;){
        change=0;
        for(int i=1;i<=N;i++)
            viz[i]=0;
        for(int i=1;i<=N;i++)
            if(!L[i])
                change |= HopcroftKarp(i);
    }

    for(int i=1;i<=N;i++)
        counter += (L[i]>0);
    cout<<counter<<'\n';
    for(int i=1;i<=N;i++)
        if(L[i]>0)
            cout<<i<<' '<<L[i]<<'\n';
}