Cod sursa(job #2695191)

Utilizator paulconst1Constantinescu Paul paulconst1 Data 12 ianuarie 2021 00:44:14
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;

#define INF (1<<30)

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


vector<int> adj[10003];

int n, m, e, pu[10003], pv[10003], d[10003];

bool bfs(){
  queue<int> q;
  for(int i=1;i<=n;++i){
    if(pu[i]==0){
      d[i]=0;
      q.push(i);
    }
    else d[i]=INF;
  }
  d[0]=INF;
  while(!q.empty()){
    int i=q.front();
    q.pop();
    if(d[i]<d[0]){
      for(auto j:adj[i]){
        if(d[pv[j]]==INF){
          d[pv[j]]=d[i]+1;
          q.push(pv[j]);
        }
      }
    }
  }
  return d[0]!=INF;
}

bool dfs(int u){
  if(u!=0){
    for(auto v:adj[u]){
      if(d[pv[v]]==d[u]+1){
        if(dfs(pv[v])){
          pv[v]=u;
          pu[u]=v;
          return 1;
        }
      }
    }
    d[u]=INF;
    return 0;
  }
  return 1;
}

int solve(){
  for(int u=1;u<=n;++u) pu[u]=0;
  for(int v=1;v<=m;++v) pv[v]=0;
  int sol=0;
  while(bfs()){
    for(int u=1;u<=n;++u){
      if(pu[u]==0){
        sol+=dfs(u);
      }
    }
  }
  return sol;
}

int main()
{
  fin>>n>>m>>e;
  for(int i=1;i<=e;++i){
    int a, b;
    fin>>a>>b;
    adj[a].push_back(b);
  }
  fout<<solve()<<"\n";;
  for(int i=1;i<=n;++i){
    if(pu[i]) fout<<i<<" "<<pu[i]<<"\n";
  }
  return 0;
}