Cod sursa(job #1549359)

Utilizator vasica38Vasile Catana vasica38 Data 12 decembrie 2015 11:42:28
Problema Cuplaj maxim in graf bipartit Scor 4
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<fstream>

using namespace std;


typedef struct lista
{
    int info;
    lista * next;
}* nod;

nod a[10123];
int r[10123];
int l[10123];
int i,j,k,m,n,u;


void add(int x, nod &p)
{
    nod r=new lista;
    r->info=x;
    r->next=p;
    p=r;
}

bool viz[10012];

bool cuplaj(int x)
{
    if (viz[x]) return false;
    viz[x]=1;
    for (nod p=a[x]; p ; p=p->next)
        if (!r[p->info] || cuplaj[r[p->info]])
        {
            r[p->info]=x;
            l[x]=p->info;
            return true;
        }
    return false;
}

int n1,n2;
int main()
{
    ifstream cin("cuplaj.in");
    ofstream cout("cuplaj.out");
    //ios_base::sync_wi1th_stdio(false);
    cin>>n1>>n2>>m;
    //cout<<m<<"\n";
    while (m--)
    {
        int x,y;
        cin>>x>>y;
        //add(x,a[y]);
        add(y,a[x]);
    }
    bool ok=true;
    while (ok)
    {
        ok=false;
        for (i=1; i<=n1; ++i) viz[i]=0;
        for (i=1; i<=n1; ++i)
         if (!l[i]) ok+=cuplaj(i);
    }
    int mx=0;
    for (i=1; i<=n1; ++i)
        if (l[i]) ++mx;
    cout<<mx<<"\n";
    for (i=1; i<=n1; ++i)
        if (l[i]) cout<<i<<" "<<l[i]<<"\n";


    return 0;
}