Cod sursa(job #953099)

Utilizator vladm97Matei Vlad vladm97 Data 24 mai 2013 20:49:41
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <queue>
#include <fstream>
#include <vector>
#define lmax 15000
#define infinit 1<<28
using namespace std;

vector<int>g[lmax];
int n,m,e,match[lmax],dist[lmax];
bool bfs()
{
    int i,u,v,l;
    queue<int>Q;
    for(i=1;i<=n;i++)
    {
        if(match[i]==0)
        {
            dist[i]=0;
            Q.push(i);
        }
        else
        {
            dist[i]=infinit;
        }
    }
    dist[0]=infinit;
    while(!Q.empty())
    {
        u=Q.front();
        Q.pop();
        if(u!=0)
        {
            l=g[u].size();
            for(i=0;i<l;i++)
            {
                v=g[u][i];
                if(dist[match[v]]==infinit)
                {
                    dist[match[v]]=dist[u]+1;
                    Q.push(match[v]);
                }
            }
        }
    }
    return (dist[0]!=infinit);
}

bool dfs(int u)
{
    int i,v,l;
    if(u!=0)
    {
        l=g[u].size();
        for(i=0;i<l;i++)
        {
            v=g[u][i];
            if(dist[match[v]]==dist[u]+1)
            {
                if(dfs[match[v]])
                {
                    match[v]=u;
                    match[u]=v;
                    return true;
                }
            }
        }
        dist[u]=infinit;
        return false;
    }
    return true;
}
int hopcroft_karp()
{
    int matching=0,i;
    while(bfs())
    {
        for(i=1;i<=n;i++)
        {
            if(match[i]==0 && dfs(i))
            {
                matching++;
            }
        }
    }
    return matching;
}

int main()
{
    int i,a,b;
    ifstream fin("cuplaj.in");
    ofstream gout("cuplaj.out");
    fin>>n>>m>>e;
    for(i=1;i<=e;i++)
    {
        fin>>a>>b;
        g[a].push_back(b);
    }
    a=hopcroft_karp();
    gout<<a<<"\n";
    for(i=1;i<=n;i++)
    {
        if(match[i]<=m)
        gout<<i<<" "<<match[i]<<"\n";
    }
}