Cod sursa(job #2388159)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 25 martie 2019 18:30:35
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
#define maxe 20000
#define pii pair<int,int>
#define fi first
#define se second

using namespace std;

struct muchie
{
  int gm, gM, c1, c2;
};

muchie v[maxe+5];
int grad[maxe+5];
bool viz[maxe+5];
vector <pii> cup;

bool cmp ( muchie a, muchie b )
{
  if ( a.gM != b.gM ) return a.gM < b.gM;
  else return a.gm < b.gm;
}

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

  int l, r, e; fin >> l >> r >> e;

  int i, j, z, a, b, c;
  for ( i = 0; i < e; i++ )
  {
    fin >> v[i].c1 >> v[i].c2; v[i].c1--; v[i].c2--;
    grad[v[i].c1]++;
    grad[l+v[i].c2]++;
  }

  for ( i = 0; i < e; i++ )
  {
    v[i].gm = min (grad[v[i].c1], grad[l+v[i].c2]);
    v[i].gM = max (grad[v[i].c1], grad[l+v[i].c2]);
  }

  sort (v, v+e, cmp);

  for ( i = 0; i < e; i++ )
    if ( viz[v[i].c1] == 0 && viz[l+v[i].c2] == 0 )
    {
      viz[v[i].c1] = viz[l+v[i].c2] = 1;
      cup.push_back ({v[i].c1,v[i].c2});
    }

  int ans = cup.size();
  fout << ans << '\n';
  for ( i = 0; i < ans; i++ )
    fout << cup[i].fi + 1 << ' ' << cup[i].se + 1 << '\n';

  fin.close ();
  fout.close ();

  return 0;
}