Cod sursa(job #1685134)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 11 aprilie 2016 15:33:04
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define int64 unsigned long long
#define INF numeric_limits<int64>::max()
#define lsb(x) (-x)&x
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int n,m;
vector< vector<int> > adj;
vector<int> gr1,gr2;
vector<bool> v;
int pairUp(int x)
{
    if(v[x]==true)
        return 0;
    v[x]=true;
    for(auto it: adj[x])
    if(gr2[it]==0)
    {
        gr2[it]=x;
        gr1[x]=it;
        return 1;
    }
    for(auto it: adj[x])
    if(pairUp(gr2[it])==1)
    {
        gr2[it]=x;
        gr1[x]=it;
        return 1;
    }
    return 0;
}
int main()
{
    int t;
    in>>n>>m>>t;
    adj=vector< vector<int> > (n+1);
    gr1=vector<int> (n+1);
    gr2=vector<int> (m+1);
    v=vector<bool> (n+1);
    for(;t;t--)
    {
        int x,y;
        in>>x>>y;
        adj[x].pb(y);
    }
    for(int ok=1;ok!=0;)
    {
        ok=0;
        for(int i=1;i<=n;i++)
            v[i]=false;
        for(int i=1;i<=n;i++)
            if(gr1[i]==0)
            ok+=pairUp(i);
    }
    int cnt=0;
    for(int i=1;i<=n;i++)
        if(gr1[i]!=0)
        cnt++;
    out<<cnt<<'\n';
    for(int i=1;i<=n;i++)
        if(gr1[i]!=0)
        out<<i<<' '<<gr1[i]<<'\n';
    return 0;
}