Cod sursa(job #1845506)

Utilizator TincaMateiTinca Matei TincaMatei Data 11 ianuarie 2017 16:46:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.71 kb
#include <cstdio>
#include <ctype.h>

class InParser {
private:
    FILE *fin;
    char *buff;
    int sp;

    char read_ch() {
        ++sp;
        if (sp == 4096) {
            sp = 0;
            fread(buff, 1, 4096, fin);
        }
        return buff[sp];
    }

public:
    InParser(const char* nume) {
        fin = fopen(nume, "r");
        buff = new char[4096]();
        sp = 4095;
    }

    InParser& operator >> (int &n) {
        char c;
        while (!isdigit(c = read_ch()) && c != '-');
        int sgn = 1;
        if (c == '-') {
            n = 0;
            sgn = -1;
        } else {
            n = c - '0';
        }
        while (isdigit(c = read_ch())) {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }

    InParser& operator >> (long long &n) {
        char c;
        n = 0;
        while (!isdigit(c = read_ch()) && c != '-');
        long long sgn = 1;
        if (c == '-') {
            n = 0;
            sgn = -1;
        } else {
            n = c - '0';
        }
        while (isdigit(c = read_ch())) {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }
}fin("cuplaj.in");

const int MAX_N = 10000;
const int MAX_M = 100000;

int last[2][1+MAX_N], next[1+2*MAX_M], mc[1+2*MAX_M];
int cuplat[2][1+MAX_N];
bool viz[2][1+MAX_N];

inline void addM(int gr, int a, int b, int id) {
  next[id] = last[gr][a];
  last[gr][a] = id;
  mc[id] = b;
}

bool augment(int node, int gr) {
  int i = last[gr][node];
  viz[gr][node] = true;
  if(gr == 1 && cuplat[gr][node] == 0) {
    return true;
  }
  else if(gr == 1) {
    if(!viz[0][cuplat[gr][node]])
      return augment(cuplat[gr][node], 1-gr);
    return false;
  } else {
    while(i != 0) {
      if(!viz[1-gr][mc[i]] && augment(mc[i], 1 - gr)) {
        cuplat[gr][node] = mc[i];
        cuplat[1-gr][mc[i]] = node;
        return true;
      }
      i = next[i];
    }
    return false;
  }
}

int main() {
  int n, m, e, a, b, cuplaj;
  cuplaj = 0;
  fin >> n >> m >> e;
  for(int i = 0; i < e; ++i) {
    fin >> a >> b;
    addM(0, a, b, i * 2 + 1);
    addM(1, b, a, i * 2 + 2);
  }

  bool ok;
  do {
    ok = false;
    for(int i = 1; i <= n; ++i)
      viz[0][i] = false;
    for(int i = 1; i <= m; ++i)
      viz[1][i] = false;
    for(int i = 1; i <= n; ++i)
      if(cuplat[0][i] == 0 && augment(i, 0))
        ok = true;
  } while(ok);

  FILE *fout = fopen("cuplaj.out", "w");
  for(int i = 1; i <= n; ++i)
    if(cuplat[0][i] > 0)
      cuplaj++;
  fprintf(fout, "%d\n", cuplaj);
  for(int i = 1; i <= n; ++i)
    if(cuplat[0][i] > 0)
      fprintf(fout, "%d %d\n", i, cuplat[0][i]);
  fclose(fout);
  return 0;
}
//autismul se manifesta prin cai misterioase
//penalitatea si-a spus cuvantul