Cod sursa(job #1625264)

Utilizator AdrianGotcaAdrian Gotca AdrianGotca Data 2 martie 2016 17:52:54
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>

using namespace std;

vector <int> G[20005],cuplat;
int n,m,e,viz[20005],deviz;
void read();
void cupleaza(int,int);
int dfs(int);
void solve();
void write();
int main(){
    read();
    solve();
    write();
    return 0;
}

void read(){
    freopen("cuplaj.in","r",stdin);
    scanf("%d%d%d",&n,&m,&e);
    for (int i=1;i<=e;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        G[x].push_back(y+n);
        G[y+n].push_back(x);
    }
}

void solve(){
    cuplat.resize(n+m+1);
    int rez=1;
    while (rez){
        rez=0;
        deviz++;
        for (int i=1;i<=n+m;i++){
            if (!cuplat[i]&&viz[i]<deviz){
                rez|=dfs(i);
            }
        }
    }
}

int dfs(int x){
    viz[x]=1;
    for (int i=0;i<G[x].size();i++){
        int y=G[x][i];
        if (viz[y]<deviz){
            viz[y]=deviz;
            if (cuplat[y]){
                if (dfs(cuplat[y])){
                    cupleaza(x,y);
                    cuplat[0]++;
                    return 1;
                }
            }
            else {
                cupleaza(x,y);
                cuplat[0]++;
                return 1;
            }
        }
    }
    return 0;
}

void cupleaza(int a,int b){
    cuplat[cuplat[a]]=0;
    cuplat[cuplat[b]]=0;
    cuplat[a]=b;
    cuplat[b]=a;
}

void write(){
    freopen("cuplaj.out","w",stdout);
    int nr=0;
    for (int i=1;i<=n;i++){
        if (cuplat[i]){
            nr++;
        }
    }
    printf("%d\n",nr);
    for (int i=1;i<=n;i++){
        if (cuplat[i]){
            printf("%d %d\n",i,cuplat[i]-n);
        }
    }
}