Cod sursa(job #2134576)

Utilizator DanizisSpartanulDani Mocanu DanizisSpartanul Data 18 februarie 2018 09:18:17
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

#define NMax 10005

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int N,M,E;
vector<int> G[NMax];
bool OK=true;
bool visited[NMax];
int st[NMax],dr[NMax];

bool PairUp(int node)
{
    if(visited[node])
        return false;

    visited[node]=true;
    for(auto child : G[node])
        if(!dr[child])
        {
            dr[child]=node;
            st[node]=child;
            return true;
        }
    for(auto child : G[node])
        if(PairUp(dr[child]))
        {
            dr[child]=node;
            st[node]=child;
            return true;
        }

    return false;
}

int main()
{
    fin>>N>>M>>E;
    for(int i=1;i<=E;i++)
    {
        int x,y;
        fin>>x>>y;
        G[x].push_back(y);
    }

    while(OK)
    {
        memset(visited,false,sizeof visited);
        OK=false;
        for(int i=1;i<=N;i++)
            if(!st[i])
                OK|=PairUp(i);
    }

    int nr=0;
    for(int i=1;i<=N;i++)
        if(st[i])
            nr++;
    fout<<nr<<"\n";
    for(int i=1;i<=N;i++)
        if(st[i])
            fout<<i<<" "<<st[i]<<"\n";

    return 0;
}