Cod sursa(job #551173)

Utilizator nickyyLal Daniel Emanuel nickyy Data 10 martie 2011 14:31:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 10005
int *a[maxn];
int L[maxn],R[maxn],Uz[maxn];
int n,m;

    void citire(void)
    {   FILE *fin=fopen("cuplaj.in","r");
        int k,x,y,p;
        fscanf(fin,"%d%d%d",&n,&m,&p);
        for(k=1;k<=n;k++) a[k]=(int*)realloc(a[k],sizeof(int)), a[k][0]=0;
        for(; p; p--)
        {   fscanf(fin,"%d%d",&x,&y);
            a[x][0]++;
            a[x]=(int*)realloc(a[x],(a[x][0]+1)*sizeof(int));
            a[x][a[x][0]]=y;
        }
        fclose(fin);
    }

    int pereche(int u)
    {   int i;
        if(Uz[u]) return 0;
        Uz[u]=1;
        for(i=1;i<=a[u][0];i++)
            if(!R[a[u][i]])
            {   L[u]=a[u][i];
                R[a[u][i]]=u;
                return 1;
            }
        for(i=1;i<=a[u][0];i++)
            if(pereche(R[a[u][i]]))
            {   L[u]=a[u][i];
                R[a[u][i]]=u;
                return 1;
            }
        return 0;
    }

    void scrie(void)
    {   FILE *fout=fopen("cuplaj.out","w");
        int i,ok,cuplaj;
        do
        {   ok=0;
            memset(Uz,0,sizeof(Uz));
            for(i=1;i<=n;i++)
                if(L[i]==0) ok=ok | pereche(i);
        }while(ok);
        for(cuplaj=0,i=1; i<=n;i++)
            cuplaj+=( L[i]>0 );
        fprintf(fout,"%d\n",cuplaj);
        for(i=1;i<=n;i++)
            if(L[i]>0) fprintf(fout,"%d %d\n",i,L[i]);
        fclose(fout);
    }

int main(void)
{   citire();
    scrie();
    return 0;
}