Pagini recente » Cod sursa (job #2238029) | Cod sursa (job #679470) | Cod sursa (job #1413035) | Cod sursa (job #44156) | Cod sursa (job #237305)
Cod sursa(job #237305)
#include<stdio.h>
struct Nod {
int x;
Nod *next;
};
int n;
int sir[605];
int ok;
int viz[300];
int x;
int l[300];
int r[300];
Nod *a[260];
int y;
int use[300];
int sol;
int m;
void insert(Nod *&u, int v)
{
Nod *k = new Nod;
k -> x = v;
k -> next = u;
u = k;
}
int PrUp(int i)
{
if (use[i]) return 0;
use[i] = 1;
for(Nod *it = a[i]; it; it = it -> next)
if (!l[it->x])
{
l[it->x] = i;
r[i] = it -> x;
return 1;
}
for(Nod *it = a[i]; it; it = it -> next)
if (PrUp(l[it->x]))
{
l[it->x] = i;
r[i] = it -> x;
return 1;
}
return 0;
}
int main()
{
freopen("strazi.in","r",stdin);
freopen("strazi.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1; i <= m; i++)
{
scanf("%d %d",&x,&y);
insert(a[x],y);
}
while (!ok)
{
ok = 1;
for(int i = 1; i <= n; i++)
use[i] = 0;
for(int i = 1; i <= n; i++)
if (!r[i])
if (PrUp(i))
{
sol++;
ok = 0;
}
}
for(int i = 1; i <= n; i++)
if (!viz[i])
{
x = i;
while (r[x])
{
sir[++sir[0]] = x;
x = r[x];
viz[x] = 1;
}
sir[++sir[0]] = x;
sir[0]++;
}
printf("%d \n",sol);
for(int i = 1; i <= sir[0] -1; i++)
if (sir[i] == 0)
printf("%d %d \n",sir[i-1],sir[i+1]);
for(int i = 1; i <= sir[0]; i++)
if (sir[i] != 0) printf("%d ",sir[i]);
return 0;
}