Cod sursa(job #1790165)

Utilizator livliviLivia Magureanu livlivi Data 27 octombrie 2016 20:56:05
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<cstdio>
#include<vector>
#include<bitset>
#define N 10000
using namespace std;

vector<int> muchii[N+1];

int right[N+1];
int left[N+1];

bitset<N+1> viz;

bool pairUp(int nod){
    if (viz[nod]==true) return false;

    viz.set(nod);
    for(int i=0;i<muchii[nod].size();i++){
        int now=muchii[nod][i];

        if (left[now]==0 ||pairUp(left[now])==true){
            left[now]=nod;
            right[nod]=now;
            return true;
        }
    }

    return false;
}

int main(){
    freopen ("cuplaj.in","r",stdin);
    freopen ("cuplaj.out","w",stdout);
    int n,m,e,i;

    scanf ("%d%d%d",&n,&m,&e);

    for(i=1;i<=e;i++){
        int x,y;
        scanf ("%d%d",&x,&y);
        muchii[x].push_back(y);
    }

    bool fl=true;
    while(fl==true){
        fl=false;

        viz.reset();
        for(i=1;i<=n;i++)
            if (right[i]==0 &&pairUp(i)==true) fl=true;
    }

    int cnt=0;
    for(i=1;i<=n;i++)
        cnt+=(right[i]!=0);

    printf ("%d\n",cnt);
    for(i=1;i<=n;i++)
        if (right[i]!=0)
            printf ("%d %d\n",i,right[i]);

    return 0;
}