Cod sursa(job #1723727)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 1 iulie 2016 14:23:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 10000
vector <int> G[MAXN+1];
int pereche[2*MAXN+1];
int con;
int vf[2*MAXN+1];
int myfind(int nod){
     int i,x,l;
     i=0;
     l=G[nod].size();
     while(i<l&&pereche[G[nod][i]]>0)
        i++;
     vf[nod]=con;
     if(i==l){
         i=0;
         while(i<l){
             x=pereche[G[nod][i]];
             if(vf[x]<con&&myfind(x)==1){
                pereche[G[nod][i]]=nod;
                pereche[nod]=G[nod][i];
                return 1;
             }
             i++;
         }
         return 0;
     }
     else{
        pereche[G[nod][i]]=nod;
        pereche[nod]=G[nod][i];
        return 1;
     }
}
int main(){
   FILE*fi,*fout;
   int N,M,E,i,x,y;
   fi=fopen("cuplaj.in" ,"r");
   fout=fopen("cuplaj.out" ,"w");
   fscanf(fi,"%d%d%d" ,&N,&M,&E);
   for(i=0;i<E;i++){
       fscanf(fi,"%d%d" ,&x,&y);
       y+=N;
       G[x].push_back(y);
   }
   con=1;
   int flag=1;
   while(flag==1){
      flag=0;
      for(i=1;i<=N;i++)
       if(pereche[i]==0){
           if(flag==0)
             flag=myfind(i);
           else
              myfind(i);
       }
      con++;
   }
   con=0;
   for(i=1;i<=N;i++)
    if(pereche[i]>0)
       con++;
   fprintf(fout,"%d\n" ,con);
   for(i=1;i<=N;i++)
    if(pereche[i]>0)
     fprintf(fout,"%d %d\n" ,i,pereche[i]-N);
   fclose(fi);
   fclose(fout);
   return 0;
}