Cod sursa(job #21018)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 22 februarie 2007 20:19:08
Problema Count Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
# 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;
}