Cod sursa(job #796948)

Utilizator cristianalex81Cristian Alexandru cristianalex81 Data 13 octombrie 2012 00:37:40
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>
#define dim 10005

using namespace std;

int g1[dim], g2[dim];
bool viz[dim];
vector <int> a[dim];

int n,m,l;

bool match(int nod)
{
    if(viz[nod])
        return false;
    viz[nod]=true;
    for (int i=0; i<a[nod].size();i++)//try direct pair up
        if(g2[a[nod][i]]==0)//can pair it up
        {
            g1[nod]=i;
            g2[a[nod][i]]=nod;
            return true;
        }

    for (int i=0; i<a[nod].size();i++)
        if(match(g2[a[nod][i]]))//try to pair up the node connected to this one
        {
            g1[nod]=i;
            g2[a[nod][i]]=nod;
            return true;
        }

return false;
}

int main()
{
    ifstream cin("cuplaj.in");
    ofstream cout("cuplaj.out");
    cin>>n>>m>>l;
    int t1,t2;
    for (int i=0; i<l; i++)
    {
        cin>>t1>>t2;
        a[t1].push_back(t2);
    }

    bool r = true;//run flag
    while(r)
    {
        for (int i=0;i<=n;i++)//mark all as unvisited
            viz[i]=false;

        for (int i=1;i<=n;i++)
            if (!g1[i])//not paired
                r = r || match(i);
    }

    int count=0;
    for(int i=1;i<=n;i++)
    if(g1[i]!=0)
        count++;
    cout<<count<<endl;

    for(int i=1;i<=n;i++)
        if(g1[i]!=0)
            cout<<i<<" "<<g2[i]<<endl;
    return 0;
}