Cod sursa(job #495832)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 26 octombrie 2010 22:19:02
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <algorithm>
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 100003
typedef unsigned int uint;

using namespace std;
FILE *f=fopen("ciclueuler.in","r");
FILE *g=fopen("ciclueuler.out","w");
int gr[Nmax],c[Nmax],ce[500002],viz[Nmax],p = 1, u = 1, nr,N,M,z;
bool ok;
vector<int> a[Nmax];
queue <int> Q;

void ciclu(int x)
{	nr = 1,c[1] = x,ok = true;
	for (int i = 0;ok && (size_t) i < a[x].size(); i++)
		{  	z = a[x][i];gr[x]--;
	        vector<int>::iterator j = find(a[z].begin(), a[z].end(), x);
			if (a[x][i] !=c[1])
			{	nr++,c[nr] = a[x][i];				
				gr[a[x][i]]--,a[z].erase(j),a[x].erase(a[x].begin());				
				x = z,i=-1;
			}
			else
			{	ok = false;
			    gr[c[1]]--,a[z].erase(j),a[x].erase(a[x].begin());
				c[++nr] = c[1];					
			}
		}
}

void inser()
{	for (int i = u; i >= p + 1; i--)
		ce[i + nr -1] = ce[i];	
	for (int i = 2; i <= nr; i++)
		ce[p + i - 1] = c[i];
}

void df(int k)
{	int s , v;
	Q.push(1),viz[1]=true;
	while(!Q.empty() ) {
		v = Q.front(),Q.pop(),viz[v] = true;
		for(s=0;(size_t)s<a[v].size();s++)
			if ( !viz[a[v][s]] ) 
				Q.push(a[v][s]);
	}	
}

int main()
{
	fscanf(f,"%d%d",&N,&M);
	int x, y;
	for (int i = 1; i <= M; i++)
	{	fscanf(f,"%d%d",&x,&y);
		
		a[x].push_back(y);
		a[y].push_back(x);
		
		gr[x]++;
		gr[y]++;
	}
	
	df(1);
	
	for (int i = 1; i <= N; i++)
		if ((viz[i] == 0 && gr[i] != 0) || gr[i] % 2)
		{	fprintf(g,"-1");
			return 0;
		}	
	ce[1] = 1;	
	
	while (p <= u)
	{	if (gr[ce[p]] > 0)
			ciclu(ce[p]),inser(),u += nr - 1;
		else
			p++;
	}
	
	for (int i = 1; i <= u-1; i++)
		fprintf(g,"%d ",ce[i]);
return 0;
}