Pagini recente » Cod sursa (job #3225702) | Cod sursa (job #933522) | Cod sursa (job #1167161) | Cod sursa (job #143782) | Cod sursa (job #21018)
Cod sursa(job #21018)
# include <stdio.h>
//# include <conio.h>
# define _fin "drumuri.in"
# define _fout "drumuri.out"
# define maxn 12003
# define maxm 30003
int *v[maxn], n, m;
int bx[maxm], by[maxm], c[maxn];
int viz[maxn];
int sol[maxn][3], ss;
void rezolva(int nod, int t);
void readf()
{
freopen(_fin, "r", stdin);
int i;
for (scanf("%d %d", &n, &m), i=1; i<=m; i++)
scanf("%d %d", bx+i, by+i), ++c[ bx[i] ], ++c[ by[i] ];
for (i=0; i<=n; i++)
v[i] = new int[ c[i]+2 ], v[i][0] = 0;
for (i=1; i<=m; i++)
v[ bx[i] ][ ++v[ bx[i] ][0] ] = by[i],
v[ by[i] ][ ++v[ by[i] ][0] ] = bx[i];
}
int q[maxn], h, e, crt[maxn], i, x, j, prec[maxn];
int list[maxn];
void df()
{
q[ h=e=1 ] = 1; viz[1]=1;
list[ list[0]=1 ] = 1;
while ( h <= e )
{
restart:
x = q[ e ];
for (j=++crt[e]; j<=v[x][0]; j++)
if ( !viz[ v[x][j] ] )
{
list[ ++list[0] ] = v[x][j];
viz[ v[x][j] ] = 1,
prec[v[x][j] ] = x;
q[ ++e ] = v[x][j];
crt[e] = 0;
goto restart;
}
--e;
}
// luam nodurile in ordinea inversa a parcurgerii
for (i=list[0]; i>=1; i--)
rezolva( list[i], prec[ list[i] ] );
}
int step;
inline void deledge(int x, int y) // delete from x's list the edge x->y
{
int i;
for (i=v[x][0]; v[x][i] != y && i>=1; i--);
if ( v[x][i] == y )
{
if ( i != v[x][0] )
printf ( " EROARE !!!!!!!!!!! \n" );
v[x][i] = v[x][ v[x][0] ]; // suprascriem ultimul
--v[x][0];
}
}
void rezolva(int nod, int t)
{
int crt;
if ( v[nod][0] & 1 )
{
// cuplez toate muchiile mai putin cea nod -> t
if ( v[nod][0] >= 3 )
for (crt=1; crt<=v[nod][0]; )
{
if ( v[ nod ][ crt ] == t ) ++crt;
if ( crt > v[nod][0] ) break; //
sol[ ++ss ][ 0 ] = v[ nod ][ crt ];
deledge( v[nod][crt], nod);
++crt;
if ( v[ nod ][ crt ] == t ) ++crt;
sol[ ss ][ 2 ] = v[ nod ][ crt];
deledge( v[nod][crt], nod );
sol[ ss ][ 1 ] = nod;
++crt;
}
v[nod][0] = 1, v[nod][1] = t; // tricksy
}
else
{
for (crt=1; crt<=v[nod][0]; )
{
sol[ ++ss ][ 0 ] = v[ nod ][ crt ];
deledge( v[ nod ][ crt ], nod );
++crt;
sol[ ss ][ 2 ] = v[ nod ][ crt];
deledge( v[ nod ][ crt ], nod );
sol[ ss ][ 1 ] = nod;
++crt;
}
}
}
void solve()
{
if ( !( m & 1 ) )
df();
}
void writef()
{
freopen(_fout, "w", stdout);
printf("%d\n", !(m&1));
// printf("wrote %d lines\n", ss);
for (int i=1; i<=ss; i++)
printf("%d %d %d\n", sol[i][0], sol[i][1], sol[i][2]);
}
int main()
{
readf();
solve();
writef();
// getch();
return 0;
}