Cod sursa(job #633365)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 13 noiembrie 2011 17:59:16
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<fstream>
#include<vector>
#include<stack>
using namespace std;
vector <int> v[100100],sol,d;
stack <int> s;
bool viz[100100];
int n;
int find_graf(int vecin,int nod) {
	int i;
	for(i=0;i<v[vecin].size();i++)
		if(v[vecin][i]==nod)
			return i;
	return 0;
}
void BFS() {
	unsigned int i,j,nod,vecin;
	for(i=0;i<d.size();i++) {
		nod=d[i];
		for(j=0;j<v[nod].size();j++) {
			vecin=v[nod][j];
			if(!viz[vecin]) {
				viz[vecin]=1;
				d.push_back(vecin);
				}
			}
		}
}
bool valid() {
	int i;
	for(i=1;i<n;i++)
		if(v[i].size()%2) return 0;
	d.push_back(1);
	viz[1]=1;
	BFS();
	for(i=1;i<=n;i++)
		if(!viz[i]) return 0;
	return 1;
}
void afis(int ans) {
	ofstream out("ciclueuler.out");
	if(ans==-1)
		out<<"-1";
	else
		for(unsigned int i=1;i<sol.size();out<<sol[i++]<<" ");
	out<<'\n';
	out.close();
}
void DFS() {
	int nod,vecin;
	while(!s.empty()) {
		nod=s.top();
		if(v[nod].size()) {
			vecin=v[nod][0];
			s.push(vecin);
			v[vecin].erase(v[vecin].begin()+find_graf(vecin,nod));
			v[nod].erase(v[nod].begin());
			}
		else sol.push_back(nod),s.pop();
		}
}
void citire() {
	int i,x,y,m;
	ifstream in("ciclueuler.in");
	in>>n>>m;
	for(i=0;i<m;i++) {
		in>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
		}
	in.close();
}
int main() {
	citire();
	if(valid()) {
		s.push(1);
		DFS();
		afis(1);
		}
	else afis(-1);
	return 0;
}