Cod sursa(job #337260)

Utilizator mihaionlyMihai Jiplea mihaionly Data 3 august 2009 10:46:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
#define nmax 10005
vector<int> v[nmax];
int l[nmax],r[nmax],n,m,sol;
bool viz[nmax];
void read()
 {
 int e,x,y;
 ifstream f("cuplaj.in");
 f>>n>>m>>e;
 for(int i=0;i<e;i++)
  {
  f>>x>>y;
  v[x].push_back(y);
  }
 }
bool cuplaj(int nod)
 {
 if(viz[nod]) return 0;
 viz[nod]=true;
 int i,x;
 for(i=0;i<v[nod].size();i++)
  {
  x=v[nod][i];
  if(!r[x])
   {
   r[x]=nod;
   l[nod]=x;
   return 1;
   }
  }
 for(i=0;i<v[nod].size();i++) 
  {
  x=v[nod][i];
  if(r[x]&&cuplaj(r[x]))
   {
   r[x]=nod;
   l[nod]=x;
   return 1;
   }
  }
 return 0;
 }
void solve()
 {
 bool ok=true;
 while(ok)
  {
  ok=false;
  memset(viz,false,sizeof(viz));
  for(int i=1;i<=n;i++)
   {
   if(!l[i]&&cuplaj(i))
    {
    ok=true;
    sol++;
    }
   }
  }
 }
void show()
 {
 ofstream g("cuplaj.out");
 g<<sol<<endl;
 for(int i=1;i<=n;i++)
  if(l[i])
   g<<i<<" "<<l[i]<<endl;
 }
int main()
 {
 read();
 solve();
 show();
 return 0;
 }