Cod sursa(job #1451628)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 17 iunie 2015 21:51:26
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator c Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 10001
#define MAXE 100001
int next[MAXE],ind[MAXN],y[MAXE],vizb[MAXN],vizf[MAXN],flag=1,con;
int parcurge(int nod){
    int p,aux;
    p=ind[nod];
    while(p>0&&vizf[y[p]]>0)
        p=next[p];
    if(p==0){
        p=ind[nod];
        while(p>0&&vizf[y[p]]>0){
            aux=vizf[y[p]];
            vizf[y[p]]=con;
            if(aux!=con&&parcurge(aux)==1){
               vizf[y[p]]=nod;
               vizb[nod]=y[p];
               return 1;
            }
            p=next[p];
        }
        return 0;
    }
    else{
        vizb[nod]=y[p];
        vizf[y[p]]=nod;
        return 1;
    }
}
int main(){
    FILE*fi,*fout;
    int i,n,m,x,e;
    fi=fopen("cuplaj.in" ,"r");
    fout=fopen("cuplaj.out" ,"w");
    fscanf(fi,"%d%d%d" ,&n,&m,&e);
    for(i=1;i<=e;i++){
        fscanf(fi,"%d%d" ,&x,&y[i]);
        next[i]=ind[x];
        ind[x]=i;
    }
    con=1;
    while(flag){
        flag=0;
        for(i=1;i<=n;i++)
          if(vizb[i]==0)
            flag=parcurge(i);
        con++;
    }
    con=0;
    for(i=1;i<=n;i++)
      if(vizb[i]>0)
         con++;
    fprintf(fout,"%d\n" ,con);
    for(i=1;i<=n;i++)
       if(vizb[i]>0)
          fprintf(fout,"%d %d\n" ,i,vizb[i]);
    fclose(fi);
    fclose(fout);
    return 0;
}