Cod sursa(job #777713)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 13 august 2012 10:01:22
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<stack>
#include<bitset>
using namespace std;
#define mod 73
vector <int> v[100001][mod+1],a;
int gr[100001],n,m,c[100001],start,l;
bitset <100001> viz;
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 <int> :: iterator it=v[c[st]][0].begin();it!=v[c[st]][0].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 sterge(int x, int y)
{
	for(vector <int> :: iterator it=v[x][y%mod+1].begin();it!=v[x][y%mod+1].end();it++)
		if(*it==y) {
			v[x][y%mod+1].erase(it);
			return;
		}
}
inline void euler(int nod)
{
	int x;
	while(v[nod][0].empty()==0) {
		x=v[nod][0].back();
		s.push(nod);
		v[nod][0].pop_back();
		sterge(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][0].push_back(y);
		v[y][0].push_back(x);
		v[x][y%mod+1].push_back(y);
		v[y][x%mod+1].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(vector <int> :: iterator it=a.begin();it!=a.end();it++)
			g<<*it<<" ";
	}
	else g<<"-1";
	g.close();
	return 0;
}