Pagini recente » Cod sursa (job #96131) | Cod sursa (job #2721673) | Cod sursa (job #1128134) | Cod sursa (job #1527159) | Cod sursa (job #170532)
Cod sursa(job #170532)
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 256
#define INF 0x3f3f3f3f
#define pb push_back
int N, M;
vector <int> lv[MAXN];
int iter, viz[MAXN];
int d[MAXN], p[MAXN];
int D[MAXN][MAXN];
int Nr;
void read ()
{
scanf ("%d %d\n", &N, &M);
int i, x, y;
for (i = 0; i < M; ++ i)
{
scanf ("%d %d\n", &x, &y);
lv[y].pb(x);
}
}
int cuplaj (int s)
{
if (viz[s] == iter)
return 0;
viz[s] = iter;
int i, sz;
for (i = 0, sz = lv[s].size(); i < sz; ++ i)
if (!d[lv[s][i]])
{
d[lv[s][i]] = s;
p[s] = lv[s][i];
return 1;
}
else if (cuplaj (d[lv[s][i]]))
{
d[lv[s][i]] = s;
p[s] = lv[s][i];
return 1;
}
return 0;
}
void DF (int i)
{
D[Nr][++D[Nr][0]] = i;
if (d[i])
DF(d[i]);
}
void solve ()
{
int verif = 0, i, j;
while (!verif)
{
verif = 1;
++ iter;
for (i = 1; i <= N; ++ i)
if (!p[i] && cuplaj (i))
{
++ iter;
verif = 0;
}
}
++ iter;
/*for (i = 1; i <= N; ++ i)
printf ("%d %d\n", d[i], i);*/
for (i = 1; i <= N; ++ i)
if (p[i]) viz[i] = iter;
for (i = 1; i <= N; ++ i)
if (viz[i] != iter)
{
//printf ("%d\n", i);
++Nr;
DF (i);
}
printf ("%d\n", Nr - 1);
for (i = 1; i < Nr; ++ i)
printf ("%d %d\n", D[i][D[i][0]], D[i + 1][1]);
for (i = 1; i <= Nr; ++ i)
for (j = 1; j <= D[i][0]; ++ j)
printf ("%d ", D[i][j]);
printf ("\n");
}
int
main ()
{
freopen ("strazi.in", "rt", stdin);
freopen ("strazi.out", "wt", stdout);
read ();
solve ();
return 0;
}