Cod sursa(job #768759)

Utilizator lucian666Vasilut Lucian lucian666 Data 17 iulie 2012 17:41:10
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb

#include<fstream>
#include<stack>
#include<list>
#include<queue>

#define pb push_back
#define NN 100001

using namespace std;
ofstream out("ciclueuler.out");

typedef list<int>:: iterator IT;
list<int>G[NN],L;
queue<int>Q;
stack<int>S;

int d[NN],uz[NN],n,m;

void read();
void BFS(int);
int conex();
int par();
int verif();
int solve();
void write(int);
void euler(int);
void stergmuchie(int,int);

int main()
{
	read();
	write(solve());
	return 0;
	
}

void read()
{
	ifstream in("ciclueuler.in");
	in>>n>>m;
	int x,y;
	
	
	for(;m;--m)
	{
		in>>x>>y;
		G[x].pb(y);
		d[x]++;
		G[y].pb(x);
		d[y]++;
	}
}

void BFS(int start)
{
	Q.push(start);
	uz[start]=1;
	while(!Q.empty())
	{
		int k=Q.front();
			for(IT i=G[k].begin();i!=G[k].end();++i)
				if(!uz[*i])
				{
					Q.push(*i);
					uz[*i]=1;
				}
			Q.pop();
	}
}

int conex()
{
	BFS(1);
	for(int i=2;i<=n;i++)
		if(!uz[i])
			return 0;
		return 1;
}

int par()
{
	for(int i=1;i<=n;i++)
		if(d[i]%2==1)
			return 0;
		return 1;
}

int verif()
{
	if(!conex())
		return 0;
	if(!par())
		return 0;
	return 1;
}

void stergmuchie(int x,int y)
{
	
	d[x]--;
	d[y]--;
	G[x].pop_front();
		for(IT i=G[y].begin();i!=G[y].end();++i)
			if(*i==x)
			{
				G[y].erase(i);
				break;
			}
}

void euler(int x)
{
	while(1)
	{
		if(G[x].empty())
			break;
		int y=G[x].front();
			S.push(y);
			stergmuchie(x,y);
			x=y;
	}
}

int solve()
{
	int x=verif();
		if(x==0)
			return -1;
		do
		{
			euler(x);
			x=S.top();
			S.pop();
			L.pb(x);
		}
		while(!S.empty());
		return 1;
}

void write(int x)
{
	if(x==-1)
		out<<-1;
	else
	{
		for(IT i=L.begin();i!=L.end();++i)
			out<<*i<<" ";
	}
}