Cod sursa(job #127286)

Utilizator filipbFilip Cristian Buruiana filipb Data 23 ianuarie 2008 18:34:46
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>
#include <string.h>
#include <vector>

using namespace std;

#define NMax 256

int N, M, st[NMax], dr[NMax], uz[NMax], bst;
vector<int> G[NMax], PATH[NMax];

int cupleaza(int nod)
{
    int i, x, sz;

    if (uz[nod])
        return 0;
        
    uz[nod] = 1;    
    for (sz = G[nod].size(), i = 0; i < sz; i++)
    {
        x = G[nod][i];
        if (!dr[x] || cupleaza(dr[x]))
        {
            st[nod] = x;
            dr[x] = nod;            
            return 1;
        }
    }
    return 0;
}

int main(void)
{
    int i, j, cnt = 0, k;
    
    freopen("strazi.in", "r", stdin);
    freopen("strazi.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for (; M; M--)
    {
        scanf("%d %d", &i, &j);
        G[i].push_back(j);
    }

    for (i = 1; i <= N; i++)
    {
        if (st[i]) continue;
        if (cupleaza(i))
            bst++;
        else
        {
            memset(uz, 0, sizeof(uz));
            bst += cupleaza(i);
        }
    }

    printf("%d\n", N-bst-1);
    for (i = 1; i <= N; i++)
        if (!dr[i])
        {
            ++cnt;
            for (j = i; j; j = st[j])
                PATH[cnt].push_back(j);
        }
    
    for (i = 1; i < cnt; i++)
    {
        j = PATH[i].size();
        printf("%d %d\n", PATH[i][j-1], PATH[i+1][0]);
    }

    for (i = 1; i <= cnt; i++)
    {
        j = PATH[i].size();
        for (k = 0; k < j; k++)
            printf("%d ", PATH[i][k]);
    }
    printf("\n");
    
    return 0;
}