Pagini recente » Cod sursa (job #1203382) | Cod sursa (job #1605889) | Cod sursa (job #1654897) | Cod sursa (job #1251671) | Cod sursa (job #2237716)
#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;
}