Cod sursa(job #567386)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 29 martie 2011 23:34:34
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <cstdio>
#include <vector>

using namespace std;

const int N = 8200;

int n, m, pairs, rez[N], l_pair[N], r_pair[N];

bool f[N], l_marc[N], r_marc[N];

vector <int> L[N];

void read() {
  int x, y;
  freopen("felinare.in", "r", stdin);
  freopen("felinare.out", "w", stdout);
  
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; ++ i) {
    scanf("%d %d", &x, &y);
    L[x].push_back(y);
  }
}

bool cupleaza(int nod) {
  if (f[nod])
    return 0;
  f[nod] = 1;

  for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it)
    if (! r_pair[*it]) {
      l_pair[nod] = *it;
      r_pair[*it] = nod;
      return 1;
    }

  for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it)
    if (r_pair[*it] && cupleaza(r_pair[*it])) {
      l_pair[nod] = *it;
      r_pair[*it] = nod;
      return 1;
    }
 
  return 0;
}

void reset(bool f[N]) {
  for (int i = 1; i < N; ++ i)
    f[i] = false;
}

void cuplaj() {
  bool ok = true;
  
  while (ok) {
    ok = false;
    reset(f);

    for (int i = 1; i <= n; ++ i)
      if ((! l_pair[i]) && cupleaza(i)) {
        ok = true;
        ++ pairs;
      }
  }
}

void init() {
  for (int i = 1; i <= n; ++ i)
    if ( l_pair[i])
      l_marc[i] = true;
}

void change_vertex(int nod) {
  for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it)
    if (! r_marc[*it]) {
      r_marc[*it] = true;
      l_marc[r_pair[*it]] = false;
      change_vertex(r_pair[*it]);
    }
}

void vertex_cover() {
  init();
  
  for (int i = 1; i <= n; ++ i)
    if(! l_marc[i])
      change_vertex(i);
}

void solve() {
  for (int i = 1; i <= n; ++ i) {
    if (! l_marc[i])
      ++ rez[i];
    if (! r_marc[i])
      rez[i] += 2;
  }
}

void afis() {
  for (int i = 1; i <= n; ++ i)
    printf("%d\n", rez[i]);
}

int main() {
  read();
  cuplaj();
  printf("%d\n", 2 * n - pairs);
  vertex_cover();
  solve();
  afis();
  return 0;
}