Cod sursa(job #1131265)

Utilizator FayedStratulat Alexandru Fayed Data 28 februarie 2014 18:58:32
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define NMAX 10001
using namespace std;

int st[NMAX];
int dr[NMAX];
bool visited[NMAX];
int n,m,e,nr;
bool ok;
vector < vector < int > > Graf;

void read(){

    int x,y;
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

        scanf("%d%d%d",&n,&m,&e);
        Graf.resize(2*n+1);

            for(register int i=1;i<=e;++i){

                scanf("%d%d",&x,&y);
                  Graf[x].push_back(y);
            }
}

bool Hopkroft_Karp(int node){

    if(visited[node])
        return 0;

    visited[node] = 1;

      for(vector < int > ::iterator it = Graf[node].begin();it!=Graf[node].end();++it)
        if(!dr[*it] || Hopkroft_Karp(dr[*it])){

            st[node] = *it;
            dr[*it] = node;
                return 1;
        }
    return 0;
}

void solve(){

    ok = 1;

        while(ok){

            ok = 0;

            for(register int i=1;i<=n;++i){

                if(!st[i])
                    if(Hopkroft_Karp(i))
                       ok = 1 , ++nr;

            memset(visited,0,sizeof(visited));
       }
    }

        printf("%d\n",nr);
        for(register int i=1;i<=n;++i)
            if(st[i])
                printf("%d %d\n",i,st[i]);
}

int main(){

    read();
    solve();

return 0;
}