Cod sursa(job #411589)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 4 martie 2010 23:36:47
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <stdio.h>
#include <queue>
#include <vector>
#define N 10001

int prev[N];
std::vector<int> v[N];

int pair[N];//cu cine e imperechiat nodul respectiv
int main ()
{std::vector<int> st1,st2,*p1=&st1,*p2=&st2,*aux;
 freopen("cuplaj.in","r",stdin);
 freopen("cuplaj.out","w",stdout);
 int n,n1,n2,m,i,j,x,y,ct=0,flag;
 int size;
 scanf("%d %d %d",&n1,&n2,&m);
 n=n1+n2;
 size=sizeof(*prev)*(n+1);
 
 for (i=1;i<=m;i++)
 {scanf("%d %d",&x,&y);
  y+=n1;
  v[x].push_back(y);
  v[y].push_back(x);
 }
 
 for (i=1;i<=n;i++)//metoda naiva de imperechere initiala
 {if(pair[i]==0)
  {for (j=0;j<v[i].size();j++)
   {if(pair[v[i][j]]==0)
    {pair[i]=v[i][j];
     pair[v[i][j]]=i;
     break;
    }
   }
  }
 }
 
 for (i=1;i<=n;i++)
 {if(pair[i]==0)
  {//parcurgere BF
   p1->clear();
   p2->clear();
   memset(prev,0,size);
   flag=0;
   p1->push_back(i);
   while(!p1->empty())
   {while(!p1->empty())
    {x=p1->back();p1->pop_back();

     for (j=0;j<v[x].size();j++)
     {if(pair[v[x][j]]==0)
      {flag=1;
       break;
      }
	  else if(pair[x]!=v[x][j])
      {p2->push_back(pair[v[x][j]]);
       prev[pair[v[x][j]]]=x;
	  }
     }
     if(flag)
      break;
    }
    if(flag)break;
    aux=p1; p1=p2; p2=aux;
   }

   if(flag)
   {p1->clear();
    p1->push_back(v[x][j]);
    for (j=x;j!=i;j=prev[j])
    {p1->push_back(j);
     p1->push_back(pair[j]);
    }
    
    p1->push_back(i);
    for (i=0;i<p1->size();i+=2)
    {pair[(*p1)[i]]=(*p1)[i+1];
     pair[(*p1)[i+1]]=(*p1)[i];
    }
   }
  }
 }

 for (i=1,ct=0;i<=n1;i++)
 {if(pair[i]!=0)
  {ct++;
  }
 }
 
 printf("%d\n",ct);
 for (i=1;i<=n1;i++)
 {if(pair[i]!=0)
  {printf("%d %d\n",i,pair[i]-n1);
  }
 }
 
 return 0;
}