Cod sursa(job #398201)

Utilizator ZillaMathe Bogdan Zilla Data 18 februarie 2010 11:01:32
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <stdio.h>

#define Nmax 275

struct nod{
    int info;
    nod *next;
};

nod *p[Nmax];

int l[Nmax],r[Nmax],v[Nmax],d[Nmax][Nmax],n,m;

void add(int k,int l)
{
    nod *current=new nod;
    current->info=l;
    current->next=p[k];
    p[k]=current;    
}

int cupleaza(int i)
{
    if(v[i])
        return 0;
    v[i]=1;
    for(nod *current=p[i];current;current=current->next)
        if(r[current->info]==0)
            {
                r[current->info]= i;
                l[i]=current->info;
                return 1;
            }
    for(nod *current=p[i];current;current=current->next)
        if(cupleaza(r[current->info]))
            {
                r[current->info]=i;
                l[i]=current->info;
                return 1;
            }
    return 0;
}



int main()
{
    int i,t,x,y,j;
    
    freopen("strazi.in","r",stdin);
    freopen("strazi.out","w",stdout);
    
    scanf("%d%d",&n,&m);
    
    for(i=1;i<=m;++i)
        {
            scanf("%d%d",&x,&y);
            add(x,y);    
        }
    
    int ok;
    for(ok=1;ok;)
        {
            ok=0;
            for(i=1;i<=n;++i)
                v[i]=0;
            for(i=1;i<=n;++i)
                if(l[i]==0)
                    ok |= cupleaza(i);
        }
    t=0;
    for(i=1;i<=n;++i)
        {
            if(!r[i])
                {
                    ++t;
                    for(j=i;j;j=l[j])
                        {
                            ++d[t][0];
                            d[t][d[t][0]]=j;    
                        }
                }
        }

    printf("%d\n",t-1);
    
    for(i=1;i<t;++i)
        printf("%d %d\n",d[i][d[i][0]],d[i+1][1]);  
      
    for(i=1;i<=t;++i)
        {
            for(j=1;j<=d[i][0];++j)
                printf("%d ",d[i][j]);
    
        }
          
    
    return 0;    
}