Cod sursa(job #934297)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 30 martie 2013 15:19:03
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<iostream>
#include<fstream>
#include<stack>
#include<vector>
using namespace std;

#define NMAX 100001

vector <int> v[NMAX];
int gr[NMAX],viz[NMAX],c[NMAX],n;
stack <int> s;

int bfs()
{
	int st,dr,nod,i;
	st=1;
	dr=1;
	c[1]=1;
	viz[1]=1;
	while(st<=dr) {
		nod=c[st];
		st++;
		for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++)
			if(viz[*it]==0) {
				c[++dr]=*it;
				viz[*it]=1;
			}
	}
	for(i=1;i<=n;i++)
		if(viz[i]==0)
			return 0;
	return 1;
}

void sterge(int x, int y)
{
	for(vector <int> :: iterator it=v[x].begin();it!=v[x].end();it++)
		if(*it==y) {
			v[x].erase(it);
			return ;
		}
}

int main ()
{
	int m,i,x,y,nod;
	ifstream f("ciclueuler.in");
	ofstream g("ciclueuler.out");
	f>>n>>m;
	for(i=1;i<=m;i++) {
		f>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
		gr[x]++;
		gr[y]++;
	}
	f.close();
	for(i=1;i<=n;i++)
		if(gr[i]%2==1) {
			g<<"-1";
			g.close();
			return 0;
		}
	if(bfs()==0) {
		g<<"-1";
		g.close();
		return 0;
	}
	s.push(1);
	while(s.empty()==0) {
		nod=s.top();
		if(v[nod].size()) {
			x=v[nod].back();
			v[nod].pop_back();
			sterge(x,nod);
			s.push(x);
		}
		else {
			g<<nod<<" ";
			s.pop();
		}
	}
	g.close();
	return 0;
}