Cod sursa(job #170532)

Utilizator vlad_popaVlad Popa vlad_popa Data 2 aprilie 2008 21:13:47
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

#define MAXN 256
#define INF 0x3f3f3f3f
#define pb push_back

int N, M;
vector <int> lv[MAXN];
int iter, viz[MAXN];
int d[MAXN], p[MAXN];
int D[MAXN][MAXN];
int Nr;

void read ()
{
    scanf ("%d %d\n", &N, &M);
    
    int i, x, y; 
    for (i = 0; i < M; ++ i)
    {
        scanf ("%d %d\n", &x, &y);
        lv[y].pb(x);
    }    
}

int cuplaj (int s)
{
    if (viz[s] == iter)
        return 0;
    viz[s] = iter;
    
    int i, sz;
    for (i = 0, sz = lv[s].size(); i < sz; ++ i)
        if (!d[lv[s][i]])
        {
            d[lv[s][i]] = s;
            p[s] = lv[s][i];
            return 1;
        }
        else if (cuplaj (d[lv[s][i]]))
        {
            d[lv[s][i]] = s;
            p[s] = lv[s][i];
            return 1;
        }
    return 0;
}

void DF (int i)
{
    D[Nr][++D[Nr][0]] = i;
    if (d[i])
        DF(d[i]);
}

void solve ()
{
    int verif = 0, i, j;
    
    while (!verif)
    {
        verif = 1;
        
        ++ iter;
        for (i = 1; i <= N; ++ i)
            if (!p[i] && cuplaj (i))
            {
                ++ iter;
                verif = 0;
            }
    }

    ++ iter;
    /*for (i = 1; i <= N; ++ i)
        printf ("%d %d\n", d[i], i);*/
        
    for (i = 1; i <= N; ++ i)
        if (p[i]) viz[i] = iter;            
        
    for (i = 1; i <= N; ++ i)
        if (viz[i] != iter)
        {
            //printf ("%d\n", i);
            ++Nr;
            DF (i);
        }
        
    printf ("%d\n", Nr - 1);
    for (i = 1; i < Nr; ++ i)
        printf ("%d %d\n", D[i][D[i][0]], D[i + 1][1]);
        
    for (i = 1; i <= Nr; ++ i)
        for (j = 1; j <= D[i][0]; ++ j)
            printf ("%d ", D[i][j]); 
    printf ("\n");
}

int
 main ()
{
    freopen ("strazi.in", "rt", stdin);
    freopen ("strazi.out", "wt", stdout);
    
    read ();
    solve ();
    
    return 0;
}