Cod sursa(job #570611)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 3 aprilie 2011 12:38:40
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<stdio.h>
#include<vector>
using namespace std;

#define pb push_back
#define NMAX 305

char viz[NMAX];
int st[NMAX],dr[NMAX];
int n,m,drum[NMAX],nr;
vector  <int> v[NMAX];

int cupleaza(int nod)
{
    int i,x,lim;
    
    if(viz[nod])
        return 0;
    viz[nod]=1;
    lim=v[nod].size();
    for(i=0;i<lim;i++)
        if(!dr[x=v[nod][i]])
        {
            dr[x]=nod;
            st[nod]=x;
            return 1;
        }
    for(i=0;i<lim;i++)
        if(cupleaza(dr[x=v[nod][i]]))
        {
            dr[x]=nod;
            st[nod]=x;
            return 1;
        }
    return 0;
}

int main ()
{
    int i,ok,a,b,x,sol=0;
    
    freopen("strazi.in","r",stdin);
    freopen("strazi.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        v[a].pb(b);
    }
    ok=1;
    while(ok)
    {
        ok=0;
        memset(viz,0,sizeof(viz));
        for(i=1;i<=n;i++)
            if(!st[i])
                ok|=cupleaza(i);
    }
    for(i=1;i<=n;i++)
        if(!st[i])
            sol++;
    sol--;
    printf("%d\n",sol);
    for(i=1;i<=n;i++)
        if(!dr[i])
        {
            for(x=i;st[x];x=st[x])
                drum[++nr]=x;
            drum[++nr]=x;
        }
    for(i=1;i<=n && sol;i++)
        if(!st[drum[i]])
        {
            printf("%d %d\n", drum[i],drum[i+1]);
            sol--;
        }
    for(i=1;i<=nr;i++)
        printf("%d ",drum[i]);
    printf("\n");
        
    return 0;
}