Cod sursa(job #1786009)

Utilizator plecinspaniaCapsunar plecinspania Data 22 octombrie 2016 11:14:22
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int n,m,k,dr[10005],st[10005];
vector <int> L[10005];
bool viz[10005];

void Citire()
{
    int i,x,y;
    fin>>n>>m>>k;
    for(i=1;i<=k;i++)
    {
        fin>>x>>y;
        L[x].push_back(y);
    }
    fin.close();
}

inline bool Cupleaza(int nod)
{
    int i,nnod;
    if(viz[nod]) return false;
    viz[nod]=true;
    for(i=0;i<L[nod].size();i++)
    {
        nnod=L[nod][i];
        if(!dr[nnod])
        {
            st[nod]=nnod;
            dr[nnod]=nod;
            return true;
        }
    }
    for(i=0;i<L[nod].size();i++)
    {
        nnod=L[nod][i];
        if(Cupleaza(dr[nnod]))
        {
            st[nod]=nnod;
            dr[nnod]=nod;
            return true;
        }
    }
    return false;
}

void Rezolvare()
{
    int i,j,gata,ans=0;
    gata=0;
    while(!gata)
    {
        gata=1;
        for(i=1;i<=n;i++) viz[i]=0;
        for(i=1;i<=n;i++) if(!st[i]&&Cupleaza(i))
        {
            ans++;
            gata=0;
        }
    }
    fout<<ans<<"\n";
    for(i=1;i<=n;i++) if(st[i]) fout<<i<<" "<<st[i]<<"\n";
    fout.close();
}

int main()
{
    Citire();
    Rezolvare();
    return 0;
}