Cod sursa(job #1409042)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 30 martie 2015 13:07:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define nmax 20005
using namespace std;
FILE *f=fopen("cuplaj.in","r"),*g=fopen("cuplaj.out","w");
vector <int> l[nmax]; int n1,n2,per[nmax],c[nmax],cul,cuplaj;
int pereche(int x)
{
    int i,j,h;
    for(i=0;i<l[x].size();i++)
    {
        j=l[x][i];
        if(c[j]!=cul)
        {
            c[j]=cul;
            if(per[j]==0||pereche(per[j]))
            {
                per[j]=x;
                per[x]=j;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int i,j,x,y,m,ok;
    fscanf(f,"%d %d %d",&n1,&n2,&m);
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d %d",&x,&y);
        y=y+n1;
        l[x].push_back(y);
        l[y].push_back(x);
    }
    ok=1;
    while(ok)
    {
        cul++,ok=0;
        for(i=1;i<=n1;i++)
            if(per[i]==0&&pereche(i))
        {
            cuplaj++;
            ok=1;
        }
    }
    fprintf(g,"%d\n",cuplaj);
    for(i=1;i<=n1;i++)
        if(per[i])
        fprintf(g,"%d %d\n",i,per[i]-n1);
    fclose(f);
    fclose(g);
    return 0;
}