Cod sursa(job #3184192)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 14 decembrie 2023 18:50:22
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include<bits/stdc++.h>
using namespace std;
ifstream F("cuplaj.in");
ofstream G("cuplaj.out");
vector<int> g[10001];
int u[10001],v[10001],d[10001],n,m,e,i,j,k;
bool A()
{
    int i;
    queue<int> q;
    for(i=1;i<=n;!u[i]?q.push(i),d[i]=0:d[i]=2e9,++i);
    for(d[0]=2e9;!q.empty();)
        if(i=q.front(),q.pop(),d[i]<d[0])
            for(int k=g[i].size(),j=0;j<k;d[v[g[i][j]]]==2e9?q.push(v[g[i][j]]),d[v[g[i][j]]]=d[i]+1:0,++j);
    return (d[0]!=2e9);
}
bool B(int i)
{
    if(i) {
        for(int k=g[i].size(),j=0;j<k;++j)
            if(d[v[g[i][j]]]==d[i]+1&&B(v[g[i][j]]))
                return v[g[i][j]]=i,u[i]=g[i][j],1;
        return d[i]=2e9,0;
    }
    return 1;
}
int main()
{
    for(F>>n>>m>>e;e--;F>>i>>j,g[i].push_back(j));
    for(;A();)
        for(i=1;i<=n;!u[i]&&B(i)?++k:0,++i);
    for(G<<k<<'\n',i=1;i<=n;++i)
        if(u[i])
            G<<i<<' '<<u[i]<<'\n';
    return 0;
}