Cod sursa(job #603908)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 19 iulie 2011 12:07:30
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <vector>

#define NMax 10005

using namespace std;

vector <int> G[NMax];
int N, M, L[NMax], R[NMax], Cuplaj;
bool Viz[NMax];

void Read ()
{
    freopen ("cuplaj.in", "r", stdin);
    int E;
    scanf ("%d %d %d", &N, &M, &E);
    for (; E>0; --E)
    {
        int X, Y;
        scanf ("%d %d", &X, &Y);
        G[X].push_back (Y);
    }
}

void Print ()
{
    freopen ("cuplaj.out", "w", stdout);
    printf ("%d\n", Cuplaj);
    for (int i=1; i<=N; ++i)
    {
        if (L[i]!=0)
        {
            printf ("%d %d\n", i, L[i]);
        }
    }
}

int PairUp (int X)
{
    if (Viz[X])
    {
        return 0;
    }
    Viz[X]=true;
    for (unsigned v=0; v<G[X].size (); ++v)
    {
        int V=G[X][v];
        if (R[V]==0)
        {
            L[X]=V;
            R[V]=X;
            return 1;
        }
    }
    for (unsigned v=0; v<G[X].size (); ++v)
    {
        int V=G[X][v];
        if (PairUp (R[V])==1)
        {
            L[X]=V;
            R[V]=X;
            return 1;
        }
    }
    return 0;
}

int main()
{
    Read ();
    for (int Change=1; Change; )
    {
        Change=0;
        for (int i=1; i<=N; ++i)
        {
            Viz[i]=false;
        }
        for (int i=1; i<=N; ++i)
        {
            if (L[i]==0)
            {
                Change|=PairUp (i);
            }
        }
    }
    Cuplaj=0;
    for (int i=1; i<=N; ++i)
    {
        if (L[i]!=0)
        {
            ++Cuplaj;
        }
    }
    Print ();
    return 0;
}