Pagini recente » Cod sursa (job #362710) | Cod sursa (job #538317) | Cod sursa (job #1018060) | Cod sursa (job #461886) | Cod sursa (job #237522)
Cod sursa(job #237522)
#include<stdio.h>
struct Nod {
int x;
Nod *next;
};
int n;
int sir[605];
int prt[305];
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])
{
int cap = 300;
sir[0] = 300;
x = i;
while (r[x] && !viz[r[x]])
{
sir[++sir[0]] = x;
viz[x] = 1;
x = r[x];
}
sir[++sir[0]] = x;
viz[x] = 1;
x = i;
while (l[x] && !viz[l[x]])
{
sir[cap--] = l[x];
viz[l[x]] = 1;
x = l[x];
}
for(int j = cap + 1; j <= sir[0]; j++)
prt[++prt[0]] = sir[j];
prt[0]++;
}
printf("%d \n",n - sol -1);
for(int i = 1; i <= prt[0] -1; i++)
if (prt[i] == 0)
printf("%d %d \n",prt[i-1],prt[i+1]);
for(int i = 1; i <= prt[0]; i++)
if (prt[i] != 0) printf("%d ",prt[i]);
return 0;
}