Cod sursa(job #2423544)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 21 mai 2019 17:59:28
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <deque>
using namespace std;
vector<vector<int> > Graph(20001);
int Pair[20001], Count[20001], i, j, N, M, E, rev, Past[20001], aug, k, Source[20001];
bool Check[20001];
deque<int> Q;
vector<pair<int, int> > Sol, Out;
int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    scanf("%d%d%d", &N, &M, &E);
    if(N>M){rev=1; swap(N, M);}
    for(i=1; i<=N+M; ++i) Graph[i].push_back(0);
    for(i=1; i<=E; ++i){
        int x, y;
        scanf("%d%d", &x, &y);
        if(rev==1) swap(x, y);
        ++Graph[x][0];
        Graph[x].push_back(y+N);
    }
    aug=1;
    while(aug!=0){
        aug=0;
        while(!Q.empty()) Q.pop_front();
        for(i=1; i<=N+M; ++i) {if(i>N)Check[i]=false; Past[i]=Source[i]=0;}
        for(i=1; i<=N; ++i) if(Check[i]==false) Q.push_back(i);
        while(!Q.empty()){
            int i=Q.front(); Q.pop_front();
            if(Check[Source[i]]==true) continue;
            for(j=1; j<=Graph[i][0]; ++j){
                if(Check[Graph[i][j]]==false){
                    Check[Graph[i][j]]=true;
                    if(Pair[Graph[i][j]]==0){
                        Past[Graph[i][j]]=i;
                        if(Source[i]!=0)Source[Graph[i][j]]=Source[i]; else Source[Graph[i][j]]=i;
                        int x=Graph[i][j], List[20001], V=0;
                        while(x!=0) {List[++V]=x; x=Past[x];}
                        for(k=V; k>=2; k-=2){Sol.push_back(make_pair(List[k], List[k-1])); ++Count[List[k]]; ++Count[List[k-1]]; Pair[List[k-1]]=List[k];}
                        ++aug; Check[List[V]]=true; break;
                    }
                    else{
                        Past[Graph[i][j]]=i; Past[Pair[Graph[i][j]]]=Graph[i][j]; if(Source[i]!=0)Source[Graph[i][j]]=Source[i]; else Source[Graph[i][j]]=i;
                        Q.push_back(Pair[Graph[i][j]]);
                    }
                }
            }
        }
    }
    for(i=0; i<Sol.size(); ++i) {
        --Count[Sol[i].first]; --Count[Sol[i].second];
        if(Count[Sol[i].first]==0 && Count[Sol[i].second]==0){
            if(Sol[i].first>N) Sol[i].first-=N;
            if(Sol[i].second>N) Sol[i].second-=N;
            if(rev==1) swap(Sol[i].first, Sol[i].second);
            Out.push_back(Sol[i]);
        }
    }
    printf("%d\n", Out.size());
    for(i=0; i<Out.size(); ++i) printf("%d %d\n", Out[i].first, Out[i].second);
    return 0;
}