Cod sursa(job #2237716)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 2 septembrie 2018 19:14:35
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

const int NMAX = 10000;

vector<int> g[1 + 2 * NMAX]; //1... nu => nu+1 nu + 2.. nu + nv
int match[1 + 2 * NMAX];
int dist[1 + 2 * NMAX];
int n, m;
bitset<1 + 2 * NMAX> vis;

bool bfs() {
   queue<int> q;
   for(int i = 1; i <= n; i ++) {
     if(match[i] == 0) {
       q.push(i);
       dist[i] = 0;
     } else
       dist[i] = -1;
   }
  // u   -> v
  // u2 <-  v (asta ne trebuie sa fie cuplat

  while(q.size()) { /// bfs-ul se face pe formatul drumului de augmentare
    int u = q.front();
    q.pop();
    for(int v : g[u]) {
      int u2 = match[v];
      if(u2 != 0 && dist[u2] == -1) {
        dist[u2] = dist[u] + 1;
        q.push(u2);
      }
    }
  }

}

int dfs(int u) {
  vis[u] = 1;
  for(int v : g[u]) {
    int u2 = match[v];
    if(u2 == 0) {
      match[v] = u;
      match[u] = v;
      return 1;
    } else if (dist[u2] == 1 + dist[u]){
      bool state = dfs(u2);
      if(state == 1) {
        match[v] = u;
        match[u] = v;
        return 1;
      }
    }
  }
  return 0;
}

int hopcroftkarp() {
  int ans = 0;
  int found = 1;
  while(found == 1) {
    found = 0;
    bfs();
    vis = 0;
    for(int i = 1; i <= n; i ++)
      if(match[i] == 0) /// tin cont de reconfigurarea din dfs
          if(dfs(i) == 1) {
          ans++;
          found = 1;
        }
  }
  return ans;
}

int main() {
  int e;
  in >> n >> m >> e;
  for(int i = 1; i <= e; i ++) {
    int x, y;
    in >> x >> y;
    y  += n;
    g[x].push_back(y);
    g[y].push_back(x);
  }

  out << hopcroftkarp() << "\n";
  for(int i=1; i <= n; i++) {
    if(match[i] != 0) {
      out << i << " " << (match[i] - n) << "\n";
    }
  }

  return 0;
}