Cod sursa(job #1199203)

Utilizator MaarcellKurt Godel Maarcell Data 18 iunie 2014 16:03:59
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <stdio.h>
#include <string.h>
struct ports{
    int port[10];
};

int N,M,K; ports C[120],E[120]; int l[120], r[120],viz[120];
bool graf[120][120];
bool cupleaza(int nod){
    if (viz[nod]) return (false);
    viz[nod]=1;
    int i;
    for (i=1; i<=M; i++)
    if ((graf[nod][i]) && (!r[i])) {
        l[nod]=i;
        r[i]=nod;
        return (true);
    }
    for (i=1; i<=M; i++)
        if ((graf[nod][i]) && (cupleaza(r[i])))  {
            l[nod]=i;
            r[i]=nod;
            return (true);
        }
    return (false);
}

int main(){
    int i,j,k,t;
    char c;
    freopen("cuplaj.txt","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d %d %d",&N,&M,&K);
   // memset(C,0,sizeof(C));
    //memset(E,0,sizeof(E));
    memset(l,0,sizeof(l));
    memset(r,0,sizeof(r));
 /*   for (i=1; i<=N; i++){
        c=' ';
        while (c!='\n'){
            scanf("%d",&C[i].port[++C[i].port[0]]);

            scanf("%c",&c);
        }
    }
    for (i=1; i<=M; i++){
       c=' ';
        while ((c!='\n') && (!feof(stdin))) {
            scanf("%d",&E[i].port[++E[i].port[0]]);
            scanf("%c",&c);

        }
    }*/
    int x,y;
    for (i=1; i<=K; i++){
        scanf("%d %d",&x,&y);
        graf[x][y]=1;
    }
    /*memset(graf,0,sizeof(graf));
    for (i=1; i<=M; i++)
        for (j=1; j<=N; j++)
            for (k=1; k<=E[i].port[0]; k++)
                for (t=1; t<=C[j].port[0]; t++)
                    if (E[i].port[k]==C[j].port[t]) graf[i][j]=1;*/
    bool ok=true;
    while (ok){
        ok=false;
        memset(viz,0,sizeof(viz));
        for (i=1; i<=N; i++) if (!l[i]) ok=ok||cupleaza(i);
    }
    int sol=0;
    for (i=1; i<=N; i++) if (l[i]) ++sol;
    printf("%d\n",sol);
    for (i=1; i<=N; i++) if (l[i]) printf("%d %d\n",i,l[i]);
    return 0;
}