Cod sursa(job #1217668)

Utilizator rangerChihai Mihai ranger Data 7 august 2014 22:16:43
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<fstream>
#include<vector>
#define pb push_back
using namespace std;

ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
const int nmax = 10010;

vector<int> g[nmax];
int n,m,edges;
int viz[nmax],f[nmax],used[nmax];

int kuhn(int v)
{
    if (viz[v]==1) return 0;
    viz[v]=1;
    for (int i=0;i<g[v].size();i++)
    {
        int to=g[v][i];
        if (f[to]==-1 || kuhn(f[to]))
        {
            f[to]=v;
            return 1;
        }
    }
    return  0;
}

int main()
{
    cin>>n>>m>>edges;
    while (edges--)
    {
        int x,y;
        cin>>x>>y;
        g[x].pb(y);
    }
    int k=0,i;
    for (i=1;i<=m;i++) f[i]=-1;
    for (i=1;i<=n;i++)
    {
        for (int j=0;j<g[i].size();j++)
            if (used[g[i][j]]==0)
        {
            used[g[i][j]]=1;
            f[g[i][j]]=i;
            k++;
            break;
        }
    }
    for (i=1;i<=n;i++)
    {
        if (used[i]==1) continue;
        for (int j=1;j<=n;j++) viz[j]=0;
        k+=kuhn(i);
    }
    cout<<k<<"\n";
    for (i=m;i>0;i--) if (f[i]!=-1) cout<<f[i]<<" "<<i<<"\n";
    return 0;
}