Cod sursa(job #953113)

Utilizator vladm97Matei Vlad vladm97 Data 24 mai 2013 21:48:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <queue>
#include <fstream>
#include <vector>
#include <string.h>
#define lmax 15000

using namespace std;

int n,m,e;
int v1[lmax],v2[lmax];
vector<int>v[lmax];
bool parcurs[lmax];
bool cuplaj(int a)
{
    if(parcurs[a])
    {
        return false;
    }
    parcurs[a]=true;
    for(int i=0;i<v[a].size();i++)
    {
        if(!v2[v[a][i]])
        {
            v2[v[a][i]]=a;
            v1[a]=v[a][i];
            return true;
        }
    }
    for(int i=0;i<v[a].size();i++)
    {
        if(cuplaj(v2[v[a][i]]))
        {
            v2[v[a][i]]=a;
            v1[a]=v[a][i];
            return true;
        }
    }
    return false;
}
int main()
{
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    f>>n>>m>>e;
    int a,b;
    while(e--)
    {
        f>>a>>b;
        v[a].push_back(b);
    }
    while(a!=0)
    {
        a=0;
        for(int i=1;i<=n;i++)
        {
            if(!v1[i] && cuplaj(i))a=1;
        }
        memset(parcurs,0,sizeof(parcurs));

    }
    for(int i=1;i<=n;i++)
    {
        if(v1[i])a++;
    }
    g<<a<<"\n";
    for(int i=1;i<=n;i++)
    {
        if(v1[i])
        {
            g<<i<<" "<<v1[i]<<"\n";
        }
    }
}