Cod sursa(job #777468)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 12 august 2012 14:15:17
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<iostream>
#include<fstream>
#include<stack>
#include<list>
#include<bitset>
using namespace std;
#define mod 11173
struct muchie {
	int x,y;
	inline muchie(int _x, int _y) {
		x=_x;
		y=_y;
	}
};
list <muchie> hash[mod];
list <int> v[100001],a;
int gr[100001],n,m,c[100001],start,l;
bitset <100001> viz;
stack <int> s;
inline void adauga(int x, int y)
{
	int k;
	k=(x+y)%mod;
	hash[k].push_back(muchie(x,y));
}
inline int cauta(int x, int y)
{
	int k;
	k=(x+y)%mod;
	for(list <muchie> :: iterator it=hash[k].begin();it!=hash[k].end();it++) 
		if(it->x==x && it->y==y) {
			hash[k].erase(it);
			return 1;
		}
	return 0;
}
inline void bfs(int nod)
{
	int st,dr;
	st=1;
	dr=1;
	viz[nod]=1;
	c[1]=nod;
	while(st<=dr) {
		for(list <int> :: iterator it=v[c[st]].begin();it!=v[c[st]].end();it++) 
			if(viz[*it]==0) {
				viz[*it]=1;
				c[++dr]=*it;
			}
		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(v[nod].empty()==0) {
		while(v[nod].empty()==0)
			if(cauta(nod,v[nod].front()))
				v[nod].pop_front();
			else break;
		if(v[nod].empty()==1)
			break;
		x=v[nod].front();
		s.push(nod);
		v[nod].pop_front();
		adauga(x,nod);
		nod=x;
	}
}
int main ()
{
	int i,x,y;
	ifstream f("ciclueuler.in");
	ofstream g("ciclueuler.out");
	f>>n>>m;
	for(i=1;i<=m;i++) {
		f>>x>>y;
		gr[x]++;
		gr[y]++;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	f.close();
	if(conex()) {
		start=1;
		do {
			euler(start);
			start=s.top();
			s.pop();
			a.push_back(start);
		}while(s.empty()==0);
		for(list <int> :: iterator it=a.begin();it!=a.end();it++)
			g<<*it<<" ";
	}
	else g<<"-1";
	g.close();
	return 0;
}