Cod sursa(job #1486320)

Utilizator andreey_047Andrei Maxim andreey_047 Data 14 septembrie 2015 17:51:52
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define nmax 100005
#define pmax 10005

using namespace std;
int N,M,e,sol;
int st[pmax],dr[pmax];
bool viz[pmax];

vector<int>G[nmax];
inline bool Cupleaza(int nod){

 if(viz[nod]) return false;

  for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();it++)
    if(!dr[*it]){
        dr[*it] = nod;
        st[nod] = *it;
        return true;
    }
  viz[nod] = 1;

  for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();it++)
   if(Cupleaza(dr[*it])){
    dr[*it] = nod;
    st[nod] = *it;
    return true;
   }
   return false;
}
inline void solve(){
 int i,gata = 1;
 while(gata){
    gata = 0;
    memset(viz,0,sizeof(viz));
     for(i = 1; i <= N; ++i)
        if(!st[i] && Cupleaza(i)){
            gata = 1;
            ++sol;
        }
 }
}
int main(){
    int i,x,y;
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d %d %d\n",&N,&M,&e);
    for(i = 1; i <= e; ++i){
        scanf("%d %d\n",&x,&y);
        G[x].push_back(y);
    }
    solve();
    printf("%d\n",sol);
    for(i = 1; i <= N; ++i)
        if(st[i])
    printf("%d %d\n",i,st[i]);
    return 0;
}