Cod sursa(job #2030795)

Utilizator cella.florescuCella Florescu cella.florescu Data 2 octombrie 2017 12:06:15
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 8191;

vector <int> g[MAXN + 1];
int l[MAXN + 1], r[MAXN + 1], seen[MAXN + 1], lside[MAXN + 1], rside[MAXN + 1];

int match(int node) {
  if (seen[node])
    return 0;
  seen[node] = 1;
  for (auto it : g[node])
    if (r[it] == 0) {
      l[node] = it;
      r[it] = node;
      return 1;
    }
  for (auto it : g[node])
    if (match(r[it])) {
      l[node] = it;
      r[it] = node;
      return 1;
    }
  return 0;
}

int max_match(int n) {
  int augm;
  do {
    augm = 0;
    memset(seen, 0, sizeof seen);
    for (int i = 1; i <= n; ++i)
      if (l[i] == 0)
        augm += match(i);
  } while (augm);
  for (int i = 1; i <= n; ++i)
    if (l[i]) {
      ++augm;
      lside[i] = 1;
    }
  return augm;
}

void swap_sides(int node) {
  for (auto it : g[node])
    if (rside[it] == 0) {
      rside[it] = 1;
      lside[r[it]] = 0;
      swap_sides(r[it]);
    }
}

int main()
{
    int n, m;
    ifstream fin("felinare.in");
    fin >> n >> m;
    for (int i = 0; i < m; ++i) {
      int x, y;
      fin >> x >> y;
      g[x].push_back(y);
    }
    fin.close();
    int mvc_size = max_match(n);
    for (int i = 1; i <= n; ++i)
      if (lside[i] == 0)
        swap_sides(i);
    ofstream fout("felinare.out");
    fout << 2 * n - mvc_size << '\n';
    for (int i = 1; i <= n; ++i)
      fout << (!lside[i]) + ((!rside[i]) << 1) << '\n';
    fout.close();
    return 0;
}