Cod sursa(job #1523701)

Utilizator andreii1Ilie Andrei andreii1 Data 13 noiembrie 2015 00:32:15
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <vector>
#define MAXN 10010
#define MAXM 10010
//#define foreach(i,v) for(vector<int>::iterator it = v.begin();it!=v.end();++it)
using namespace std;

int n,m,r,viz[MAXN],L[MAXN],R[MAXM],sum;
vector <int> v[MAXN];

int augment(int k)
{
    if(viz[k]==1)return 0;
    viz[k]=1;
    for(vector<int>::iterator y = v[k].begin();y!=v[k].end();++y)
    if(R[*y]==0)
    {
        R[*y]=k;
        L[k]=*y;
        return 1;
    }
    for(vector<int>::iterator y = v[k].begin();y!=v[k].end();++y)
    if(augment(R[*y]))
    {
        R[*y]=k;
        L[k]=*y;
        return 1;
    }
    return 0;
}
int main()
{
    int x,y;
    int ok=1;
    FILE *f=fopen("cuplaj.in","r");
    FILE *g=fopen("cuplaj.out","w");
    fscanf(f,"%d %d %d",&n,&m,&r);
    for(int i=1;i<=r;i++)
    {
        fscanf(f,"%d %d",&x,&y);
        v[x].push_back(y);
    }
    while(ok)
    {
        ok=0;
        for(int i=1;i<=n;i++)viz[i]=0;
        for(int i=1;i<=n;i++)
        if(L[i]==0)
        {
            ok=ok|augment(i);
        }
    }
    for(int i=1;i<=n;i++)if(L[i])sum++;
    fprintf(g,"%d\n",sum);
    for(int i=1;i<=n;i++)if(L[i])fprintf(g,"%d %d\n",i,L[i]);
    fclose(f);
    fclose(g);
    return 0;
}