Pagini recente » Cod sursa (job #2949163) | Cod sursa (job #1147778) | Cod sursa (job #2450465) | Cod sursa (job #1074249) | Cod sursa (job #1549382)
#include <iostream>
#include <vector>
using namespace std;
const int MAX = 10005;
vector <int> g[MAX];
int st[MAX], dr[MAX],vis[MAX];
int dfs(int i) {
int s;
if (vis[i])
return false;
vis[i] = true;
for (int j = 0; j < g[i].size(); j++) {
s = g[i][j];
if (dr[s] == 0) {
st[i] = s;
dr[s] = i;
return true;
}
if (dfs(dr[s])) {
st[i] = s;
dr[s] = i;
return true;
}
}
return false;
}
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
int n, m, e, nr = 0;
cin >> n >> m >> e;
for (int i = 1; i <= e; i++) {
int a, b;
cin >> a >> b;
g[a].push_back(b);
}
int ok = 1;
while (ok) {
ok = false;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)
if (st[i] == 0 && dfs(i))
ok = true;
}
for (int i = 1; i <= n; i++)
if (st[i])
nr++;
cout << nr << "\n";
for (int i = 1; i <= n; i++)
if (st[i])
cout << i << " " << st[i] << "\n";
return 0;
}
/*#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAX = 10004;
vector<int> g[MAX];
int e[MAX * 2],n,m,E,v[MAX * 2][MAX * 2],vis[2 * MAX],c[2 * MAX],dr[MAX],st[MAX];
/*
int dfs(int i) {
vis[i] = 1;
for (int j = 1; j <= e[i]; j++) {
int k = v[i][j];
if (vis[k] || c[k] == i)
continue;
if (c[k] == -1) {
vis[k] = 1;
c[i] = k;
return 1;
}
else {
vis[k] = 1;
if (dfs(c[k])) {
c[k] = i;
c[i] = k;
return 1;
}
else
continue;
}
}
return 0;
}*/ /*
bool dfs(int x) {
int i, son;
if (vis[x]) return false;
vis[x] = true;
for (i = 0; i<g[x].size(); i++) {
son = g[x][i];
if (dr[son] == 0) {
st[x] = son;
dr[son] = x;
return true;
}
if (dfs(dr[son])) {
st[x] = son;
dr[son] = x;
return true;
}
}
return false;
}
/**/
/*
int main() {
freopen("cuplaj.in", "r", stdin);
// freopen("cuplaj.out", "w", stdout);
memset(c, -1, sizeof(c));
cin >> n >> m >> E;
for (int i = 0; i < E; i++) {
int a, b;
cin >> a >> b;
g[a].push_back(b);
}
int ok = 1;
while (ok) {
ok = 0;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)
if (vis[i] && st[i] == 0) {
if (dfs(i))
ok = 1;
}
}
int nr = 0;
for (int i = 1; i <= n; i++)
if (st[i])
nr++;
printf("%d\n", nr);
for (int i = 1; i <= n; i++)
if (st[i])
printf("%d %d\n", i, st[i]);
return 0;
}*/