Cod sursa(job #781529)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 24 august 2012 16:38:42
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<stack>
#include<bitset>
using namespace std;

struct NOD {
	int y,nr;
};
vector <NOD> v[100001];
int gr[100001],n,m,c[100001],a[500001],start,l;
bitset <100001> viz;
bitset <500001> util;
stack <int> s;
inline void bfs(int nod)
{
	int st,dr;
	st=1;
	dr=1;
	viz[nod]=1;
	c[1]=nod;
	while(st<=dr) {
		for(vector <NOD> :: iterator it=v[c[st]].begin();it!=v[c[st]].end();it++) 
			if(viz[it->y]==0) {
				viz[it->y]=1;
				c[++dr]=it->y;
			}
		st++;
	}
}
inline int conex()
{
	int i;
	for(i=1;i<=n;i++)
		if(gr[i]%2==1) 
			return 0;
	bfs(1);
	for(i=1;i<=n;i++)
		if(viz[i]==0)
			return 0;
	return 1;
}
inline void euler(int nod)
{
	int x;
	while(1) {
		x=-1;
		while(v[nod].empty()==0) 
			if(util[v[nod].back().nr]==0) {
				x=v[nod].back().y;
				util[v[nod].back().nr]=1;
				break;
			}
			else v[nod].pop_back();
		if(x==-1)
			return;
		s.push(nod);
		v[nod].pop_back();
		nod=x;
	}
}
int main ()
{
	int i,x,y;
	NOD u;
	ifstream f("ciclueuler.in");
	ofstream g("ciclueuler.out");
	f>>n>>m;
	for(i=1;i<=m;i++) {
		f>>x>>u.y;
		gr[x]++;
		gr[u.y]++;
		u.nr=i;
		v[x].push_back(u);
		y=u.y;
		u.y=x;
		v[y].push_back(u);
	}
	f.close();
	if(conex()) {
		start=1;
		do {
			euler(start);
			start=s.top();
			s.pop();
			a[++a[0]]=start;
		}while(s.empty()==0);
		for(i=1;i<=a[0];i++)
			g<<a[i]<<" ";
	}
	else g<<"-1";
	g.close();
	return 0;
}