Cod sursa(job #397823)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 17 februarie 2010 15:51:37
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<stdio.h>
#include<vector>
#define Nmx 262

using namespace std;

int pre[Nmx],r[Nmx],viz[Nmx];
struct nood
{
    int inf;
    nood *urm;
}*G[Nmx];
vector <int> D[Nmx];
int n,m,sol;

void add(int x,int y)
{
    nood *aux=new nood;
    aux->inf=y;
    aux->urm=G[x];
    G[x]=aux;
}

void citire()
{
    int i,x,y;
    scanf("%d%d",&n,&m);
    for (i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        add(x,y);
    }
}

int pair_u(int nod)
{
    int i;
    if (viz[nod])
        return 0;
    viz[nod]=1;
    for (nood *p=G[nod];p;p=p->urm)
        if (!r[p->inf])
        {
            r[p->inf]=nod;
            pre[nod]=p->inf;
            return 1;
        }
    for (nood *p=G[nod];p;p=p->urm)
        if (pair_u(r[p->inf]))
        {
            pre[nod]=p->inf;
            r[p->inf]=nod;
            return 1;
        }
    return 0;
}

void solve ()
{
    int i,j,ok;
    do
    {
        ok=0;
        for (i=1; i<=n; ++i)
            if (!pre[i]&&pair_u(i))
                ok=1;
        memset(viz,0,sizeof(viz));
    }
    while (ok);
    for (i=1; i<=n; ++i)
        if (!r[i])
        {
            ++sol;
            for (j=i;j;j=pre[j])
                D[sol].push_back(j);
        }
    printf("%d\n",sol-1);
    for (i=1; i<sol; ++i)
        printf ("%d %d\n",D[i].back (),D[i+1].front ());
    for (i=1;i<=sol;++i)
        for (j=0;j<D[i].size();++j)
            printf ("%d ",D[i][j]);
}

int main()
{
    freopen("strazi.in","r",stdin);
    freopen("strazi.out","w",stdout);
    citire();
    solve();
    return 0;
}