Cod sursa(job #1166218)

Utilizator span7aRazvan span7a Data 3 aprilie 2014 12:58:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<cstdio>
#include<vector>
#include<cstring>
#define maxx 10001
using namespace std;
FILE *f=fopen("cuplaj.in","r");
FILE *g=fopen("cuplaj.out","w");
vector<int>L[maxx];
bool viz[maxx];
int part1[maxx],part2[maxx];
int potrivire(int nodcur)
{
    int j,vecin;
    if(viz[nodcur])return 0;
    viz[nodcur]=true;
    for(j=0;j<L[nodcur].size();j++)
    {
        vecin=L[nodcur][j];
        if(part2[vecin]==0)
        {
                part1[nodcur]=vecin;
                part2[vecin]=nodcur;
                return 1;
        }
    }
    for(j=0;j<L[nodcur].size();j++)
    {
        vecin=L[nodcur][j];
        if(potrivire(part2[vecin]))
        {
            part1[nodcur]=vecin;
            part2[vecin]=nodcur;
            return 1;
        }
    }
    return 0;
}
int main()
{
    int i,n,m,e,ok,nr=0,x,y;
    fscanf(f,"%d%d%d",&n,&m,&e);
    for(i=1;i<=e;i++)
    {
        fscanf(f,"%d%d",&x,&y);
        L[x].push_back(y);
    }
    ok=1;
    while(ok)
    {
        ok=0;
        memset(viz,false,sizeof(viz));
        for(i=1;i<=n;i++)
            if(part1[i]==0)ok+=potrivire(i);
    }
    for(i=1;i<=n;i++)
        if(part1[i])nr++;
    fprintf(g,"%d\n",nr);
    for(i=1;i<=n;i++)
        if(part1[i])
            fprintf(g,"%d %d\n",i,part1[i]);
    return 0;
}