Cod sursa(job #696290)

Utilizator giuliastefGiulia Stef giuliastef Data 28 februarie 2012 17:52:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <cstring>
#include <vector>
#define NMAX 10011
using namespace std;
vector <int> G[NMAX];
int N,M,used[NMAX],left[NMAX],right[NMAX];
void Read(){
     int Edges,x,y;
     freopen("cuplaj.in","r",stdin);
     scanf("%d%d%d",&N,&M,&Edges);
     for(;Edges>0;Edges--){
      scanf("%d%d",&x,&y);
      G[x].push_back(y);             
     }
}
bool Pair(int nod){
    if(used[nod]) return 0;
    used[nod]=1;
    vector <int>::iterator it;
    for(it=G[nod].begin();it!=G[nod].end();it++)
     if(!right[*it]){
      left[nod]=*it;
      right[*it]=nod;
      return 1;
     }
    for(it=G[nod].begin();it!=G[nod].end();it++) 
     if(Pair(right[*it])){
      left[nod]=*it;
      right[*it]=nod;
      return 1;
     }
    return 0;
}
void Solve(){
     int i,ok;
     ok=1;
     for(;ok;){
             ok=0;
             memset(used,0,sizeof(used));
             for(i=1;i<=N;i++) 
              if(!left[i]) ok|=Pair(i);
     }
}
void Write(){
     int cuplaj=0,i;
     freopen("cuplaj.out","w",stdout);
     for(i=1;i<=N;i++) cuplaj+=(left[i]>0);
     printf("%d\n",cuplaj);
     for(i=1;i<=N;i++) 
      if(left[i]) printf("%d %d\n",i,left[i]);
}
int main(){
    Read();
    Solve();
    Write();
    return 0;
}