Cod sursa(job #738573)

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

int n,m,e;
vector<int> l[100000]; 
queue<int> c;
int left[100000],right[100000];

void cupleaza(int u){
     int viz[100000],tata[100000],x,a,b,i;
     memset(viz,0,sizeof(viz));
     memset(tata,-1,sizeof(tata));
     if(right[u]!=-1)
        return;
     
     c.push(u);
     viz[u]=1;
    while(c.size()>0){
         x=c.front();
        
         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;
                          
                 } 
     } 
     printf("\n"); 
}
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");
     for(i=0;i<n;i++)
         cupleaza(i);
     
    for(int i=0;i<n;i++)
           if(right[i]>=0)
               fprintf(g,"%d %d\n",i+1,right[i]+1);
     fclose(g);          
     return 0;   
}