Cod sursa(job #1723530)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 30 iunie 2016 21:12:18
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 10000
vector <int> G[2*MAXN+1];
int pereche[2*MAXN+1];
int con;
int vf[2*MAXN+1];
inline int myfind(int nod){
     int i;
     i=0;
     while(i<G[nod].size()&&pereche[G[nod][i]]>0)
        i++;
     if(i==G[nod].size()){
         i=0;
         while(i<G[nod].size()){
             vf[nod]=con;
             if(vf[pereche[G[nod][i]]]<con&&pereche[G[nod][i]]!=nod&&myfind(pereche[G[nod][i]])==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);
       G[y].push_back(x);
   }
   con=1;
   for(i=1;i<=N;i++)
    if(pereche[i]==0){
       x=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;
}