Pagini recente » Cod sursa (job #180261) | Cod sursa (job #1620715) | Cod sursa (job #1805850) | Cod sursa (job #1958762) | Cod sursa (job #127286)
Cod sursa(job #127286)
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define NMax 256
int N, M, st[NMax], dr[NMax], uz[NMax], bst;
vector<int> G[NMax], PATH[NMax];
int cupleaza(int nod)
{
int i, x, sz;
if (uz[nod])
return 0;
uz[nod] = 1;
for (sz = G[nod].size(), i = 0; i < sz; i++)
{
x = G[nod][i];
if (!dr[x] || cupleaza(dr[x]))
{
st[nod] = x;
dr[x] = nod;
return 1;
}
}
return 0;
}
int main(void)
{
int i, j, cnt = 0, k;
freopen("strazi.in", "r", stdin);
freopen("strazi.out", "w", stdout);
scanf("%d %d", &N, &M);
for (; M; M--)
{
scanf("%d %d", &i, &j);
G[i].push_back(j);
}
for (i = 1; i <= N; i++)
{
if (st[i]) continue;
if (cupleaza(i))
bst++;
else
{
memset(uz, 0, sizeof(uz));
bst += cupleaza(i);
}
}
printf("%d\n", N-bst-1);
for (i = 1; i <= N; i++)
if (!dr[i])
{
++cnt;
for (j = i; j; j = st[j])
PATH[cnt].push_back(j);
}
for (i = 1; i < cnt; i++)
{
j = PATH[i].size();
printf("%d %d\n", PATH[i][j-1], PATH[i+1][0]);
}
for (i = 1; i <= cnt; i++)
{
j = PATH[i].size();
for (k = 0; k < j; k++)
printf("%d ", PATH[i][k]);
}
printf("\n");
return 0;
}