Cod sursa(job #2808549)

Utilizator victorzarzuZarzu Victor victorzarzu Data 25 noiembrie 2021 11:46:54
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f

using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, vert;
vector<int> graph[10001];
int l[10001], r[10001];
bool visited[10001];

void read()
{
  f>>n>>m>>vert;
  int x, y;
  for(int i = 1;i <= vert;++i)
    f>>x>>y, graph[x].push_back(y);
}

bool verify(int node)
{
  if(visited[node]) return false;
  visited[node] = true;

  for(auto it : graph[node])
    if(!r[it])
      {
        l[node] = it;
        r[it] = node;
        return true;
      }
  
  for(auto it : graph[node])
    if(verify(r[it]))
      {
        r[it] = node;
        l[node] = it;
        return true;
      }
  return false;
}

void solve()
{
  bool change = true;
  while(change)
  {
    change = false;
    memset(visited, false, sizeof(visited));
    for(int i = 1;i <= n;++i)
      if(!l[i])
        change |= verify(i);
  }

  int number = 0;
  for(int i = 1;i <= n;++i)
    if(l[i])
      ++number;
  g<<number<<'\n';
  
  for(int i = 1;i <= n;++i)
    if(l[i])
      g<<i<<" "<<l[i]<<'\n';
}

int main()
{
  read();
  solve();
  return 0;
}