Cod sursa(job #879313)

Utilizator TeOOOVoina Teodora TeOOO Data 15 februarie 2013 11:17:18
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;

//Constante
const int sz = (int)1e5+1;

//Functii
int link(int node);

//Variabile
FILE *in,*out;

int leftNodes, rightNodes, edges;
int Left[sz], Right[sz], Fixed[sz];
int Sol;
vector<int> graph[sz];

int main()
{
    in=fopen("cuplaj.in","rt");
    out=fopen("cuplaj.out","wt");

    fscanf(in,"%d%d%d",&leftNodes, &rightNodes, &edges);
    while(edges--)
    {
        int rFrom, rTo;
        fscanf(in,"%d%d",&rFrom,&rTo);
        graph[rFrom].push_back(rTo);
    }

    for(int i=1; i<=leftNodes; ++i)
    {
        if(Left[i] == 0)
        {
            if(!link(i))
            {
                memset(Fixed, 0, sizeof(Fixed));
                Sol += link(i);
            }
            else ++Sol;
        }
    }

    fprintf(out,"%d\n",Sol);
    for(int i=1;i<=leftNodes; ++i)
        if(Left[i])
            fprintf(out,"%d %d\n",i, Left[i]);
    fclose(in);
    fclose(out);
    return 0;
}

int link(int node)
{
    if(Fixed[node] == 1)
        return 0;
    Fixed[node] = 1;

    vector<int>::iterator it, end = graph[node].end();

    for(it = graph[node].begin(); it!=end; ++it)
        if(!Right[*it])
        {
            Right[*it] = node;
            Left[node] = *it;
            return 1;
        }

     for(it = graph[node].begin(); it!=end; ++it)
        if(link(Right[*it]))
        {
            Right[*it] = node;
            Left[node] = *it;
            return 1;
        }
    return 0;
}