Cod sursa(job #738583)

Utilizator Mirc100Mircea Octavian Mirc100 Data 20 aprilie 2012 23:28:29
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <queue>
#include<stdio.h>
#include <cstring>
using namespace std;

int n,m,e;
vector<int> l[100000]; 

int left[100000],right[100000];

int cupleaza(int u){
     int viz[100000],tata[100000],x,a,b,i;
     memset(viz,0,sizeof(viz));queue<int> c;
     memset(tata,-1,sizeof(tata));
     if(right[u]!=-1)
        return 0;
   //  printf ("\n %d: ", u);
     c.push(u);
   //  viz[u]=1;
    while(c.size()>0){
         x=c.front();
      //   printf("%d ",x);
         c.pop();
         for(i=0;i<l[x].size();i++)
              if(viz[l[x][i]]==0)
                  if((left[l[x][i]]!=-1)&&(left[l[x][i]]!=x)){
                      c.push( left[l[x][i]]);
                     
                      viz[l[x][i]]=1;
                      tata[left[l[x][i]]]=x;
                   }
                  else{
                       a=right[x];
                       right[x]=l[x][i];
                       left[l[x][i]]=x;
                       x=tata[x];
                       while(x!=-1){
                             
                             b=right[x];
                             right[x]=a;
                             left[a]=x;
                             a=b;
                             x=tata[x];
                       }     
                
                      return 1;
                          
                 } 
               
     } 
   return 0;
}
int main(){
     FILE *f,*g;
     int i,x,y;
     queue<int> c;
     f=fopen("cuplaj.in","r");
     fscanf(f,"%d %d %d",&n,&m,&e);
     for(i=0;i<e;i++){
         fscanf(f,"%d %d",&x,&y);
         l[x-1].push_back(y-1);
     }
     fclose(f);
    memset(left,-1,sizeof(left));
    memset(right,-1,sizeof(right));
     g=fopen("cuplaj.out","w");
     int ok=1;
     while(ok){
       ok=0;        
       for(i=0;i<n;i++)
         if(cupleaza(i))
            ok=1;
} 
    for(int i=0;i<n;i++)
           if(right[i]>=0)
               fprintf(g,"%d %d\n",i+1,right[i]+1);
     fclose(g);  
     //system("pause");        
     return 0;   
}