Pagini recente » Cod sursa (job #2583764) | Cod sursa (job #1217080) | Cod sursa (job #706869) | Cod sursa (job #1328564) | Cod sursa (job #1576747)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N = 270;
vector <int> graph [2 * N];
vector <pair <int, int> > l;
int n, dr, X [2 * N], Y [2 * N];
bool used [2 * 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 (!Y [*it]) {
X [x] = *it;
Y [*it] = x;
return 1;
}
for (it = graph [x].begin (); it != graph [x].end (); ++ it)
if (Y [*it] && Y [*it] != x) {
flag = cuplaj (Y [*it]);
if (flag == 1) {
Y [*it] = x;
X [x] = *it;
return 1;
}
}
return 0;
}
void dfs (int x, bool af) {
int urm;
used [x] = 1;
if (af == 1)
printf ("%d ", (x + 1) / 2);
dr = x;
urm = X [x];
if (urm == 0)
return;
urm ++;
dfs (urm, af);
}
int main () {
int i, m, a, b, A1, A2, B1, B2, lim, ans = 0, st;
vector <pair <int, int> > :: iterator it;
bool flag;
freopen ("strazi.in", "r", stdin);
freopen ("strazi.out", "w", stdout);
scanf ("%d%d", &n, &m);
lim = 2 * n;
for (i = 1; i <= m; i ++) {
scanf ("%d%d", &a, &b);
A1 = 2 * a - 1;
A2 = 2 * a;
B1 = 2 * b - 1;
B2 = 2 * b;
graph [A2].push_back (B1);
}
flag = true;
while (flag) {
flag = 0;
memset (used, 0, sizeof (used));
for (i = 2; i <= lim; i = i + 2)
if (X [i] == 0) {
if (cuplaj (i) == 1) {
ans ++;
flag = 1;
}
}
}
printf ("%d\n", n - 1 - ans);
memset (used, 0, sizeof (used));
for (i = 2; i <= lim; i = i + 2)
if (X [i]) {
st = i;
dfs (i, 0);
l.push_back (make_pair (st, dr));
}
else
if (!used [i])
l.push_back (make_pair (i, i));
for (it = l.begin (); (it + 1)!= l.end (); ++ it)
printf ("%d %d\n", ((*it).second + 1) / 2, ((*(it + 1)).first + 1) / 2);
memset (used, 0, sizeof (used));
for (it = l.begin (); it != l.end (); ++ it)
dfs ((*it).first, 1);
return 0;
}