Cod sursa(job #3268963)

Utilizator cris71Vlad Bogdan Cristian cris71 Data 18 ianuarie 2025 09:55:57
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
int n1,n2,m;
int const lmax=1e4+7;
bool viz[lmax];
vector<int> G[lmax];
int l[lmax],match[lmax];
pair <int, int> rez[lmax];
int index_rez;
bool goofy(int node)
{
    if(viz[node]==true)return false;
    viz[node]=true;
    for(auto vec:G[node])
    {
        if(match[vec]==-1 or goofy(match[vec])==true)
        {
            l[node]=vec;
            match[vec]=node;
            return true;
        }
    }
    return false;
}
int main()
{
    fin>>n1>>n2>>m;
    for(int i=0;i<m;i++)
    {
        int x,y;
        fin>>x>>y;
        x--;y--;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    for(int i=0;i<n1;i++)
    {
        match[i]=-1;
    }
    for(int i=0;i<n2;i++)
    {
        l[i]=-1;
    }
    int change=1;
    while(change)
    {
        for(int i=0;i<n1;i++)viz[i]=false;///initializez vectorul
        change=0;
        for(int i=0;i<n1;i++)
        {
            if(l[i]==-1)
            {
                change|=goofy(i);
            }
        }
    }
    for(int i=0;i<n1;i++)
    {
        if(match[i]!=-1)
        {
            rez[index_rez++]={match[i]+1,i+1};
        }
    }
    fout<<index_rez<<"\n";
    for(int i=0;i<index_rez;i++)
    {
        fout<<rez[i].first<<" "<<rez[i].second<<"\n";
    }
    return 0;
}