Cod sursa(job #2163753)

Utilizator catalinlupCatalin Lupau catalinlup Data 12 martie 2018 19:50:52
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <bits/stdc++.h>
#define INFILE "cuplaj.in"
#define OUTFILE "cuplaj.out"
#define NIL 0
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
const int INF=INT_MAX;
int M,N;
struct Arbore{
    vector<vector<int>> Adj;
    void init(int n){
        Adj.resize(n+1);
    }
    void Add(int x,int y){
        Adj[x].push_back(y);
        Adj[y].push_back(x);
    }
}A;
bool BFS(int dist[],int pairU[],int pairV[],int m){
    queue<int> coada;
    for(int u=1;u<=m;u++){
        if(pairU[u]==NIL){
            dist[u]=0;
            coada.push(u);
        }
        else{
            dist[u]=INF;
        }
    }
    dist[NIL]=INF;
    while(!coada.empty()){
        int u=coada.front();
        coada.pop();
        for(auto v:A.Adj[u]){
            v-=m;
            if(dist[pairV[v]]==INF){
                dist[pairV[v]]=dist[u]+1;
                coada.push(pairV[v]);
            }
        }
    }
    return (dist[NIL]!=INF);
}
bool DFS(int u,int dist[],int pairU[],int pairV[],int m){
    if(u!=NIL){
        for(auto v:A.Adj[u]){
            v-=m;
            if(dist[pairV[v]]==dist[u]+1){
                if(DFS(pairV[v],dist,pairU,pairV,m)){
                    pairV[v]=u;
                    pairU[u]=v;
                    return true;
                }
            }
        }
        dist[u]=INF;
        return false;
    }
    return true;
}
void HopcroftKarp(int m,int n){
    int pairU[n+m+1];
    int pairV[m+n+1];
    int dist[n+m+1];

    memset(pairU,NIL,sizeof(pairU));
    memset(pairV,NIL,sizeof(pairV));
    int result=0;
    while(BFS(dist,pairU,pairV,m)){
        //cout<<"DA\n";
        for(int u=1;u<=m;u++){
            if(pairU[u]==NIL&&(DFS(u,dist,pairU,pairV,m)))
                result++;
        }
    }
    out<<result<<"\n";
    for(int i=1;i<=M;i++){
        if(pairU[i]==NIL) continue;
        out<<i<<" "<<pairU[i]<<"\n";
    }
}

void Read(){
    int E;
    in>>M>>N>>E;
    A.init(M+N);
    for(int i=1;i<=E;i++){
        int x,y;
        in>>x>>y;
        A.Add(x,M+y);
    }
}

int main(){
    Read();
    HopcroftKarp(M,N);
    return 0;
}