Pagini recente » Cod sursa (job #2722685) | Cod sursa (job #1438483) | Cod sursa (job #1543396) | Cod sursa (job #2564924) | Cod sursa (job #1579396)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N = 270;
vector <int> graph [N];
vector <pair <int, int> > l;
int n, a [N], b [N], st [N], dr [N], right;
bool used [N];
bool cuplaj (int x) {
bool flag;
vector <int> :: iterator it;
if (used [x] == 1)
return 0;
used [x] = 1;
for (it = graph [x].begin (); it != graph [x].end (); ++ it)
if (!b [*it]) {
a [x] = *it;
b [*it] = x;
return 1;
}
for (it = graph [x].begin (); it != graph [x].end (); ++ it)
if (b [*it] && b [*it] != x) {
flag = cuplaj (b [*it]);
if (flag == 1) {
b [*it] = x;
a [x] = *it;
return 1;
}
}
return 0;
}
void dfs (int x, int af) {
if (af == 1)
printf ("%d ", x);
if (used [x] == 1 && af == 0) {
right = dr [x];
st [x] = dr [x] = 0;
return;
}
used [x] = 1;
right = x;
if (a [x])
dfs (a [x], af);
}
int main () {
int i, m, x, y, ans = 0, last;
vector <pair <int, int> > :: iterator it;
bool flag;
freopen ("strazi.in", "r", stdin);
freopen ("strazi.out", "w", stdout);
scanf ("%d%d", &n, &m);
for (i = 1; i <= m; i ++) {
scanf ("%d%d", &x, &y);
graph [x].push_back (y);
}
flag = true;
while (flag) {
flag = 0;
memset (used, 0, sizeof (used));
for (i = 1; i <= n; i ++)
if (a [i] == 0) {
if (cuplaj (i) == 1) {
ans ++;
flag = 1;
}
}
}
printf ("%d\n", n - 1 - ans);
memset (used, 0, sizeof (used));
for (i = 1; i <= n; i ++) {
st [i] = i;
dfs (i, 0);
dr [i] = right;
}
last = 0;
for (i = 1; i <= n; i ++)
if (st [i]) {
if (last)
printf ("%d %d\n", last, st [i]);
last = dr [i];
}
for (i = 1; i <= n; i ++)
if (st [i]) {
dfs (i, 1);
}
printf ("\n");
return 0;
}