Cod sursa(job #634610)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 16 noiembrie 2011 19:18:08
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<fstream>
#include<vector>
#include<stack>
using namespace std;
///////////////////////
#define MaxBuffer 8192
char buffer[MaxBuffer];
int bufferIndex=8191;
///////////////////////
vector <pair <int,bool> > v[100100];
vector <int> sol,d;
stack <int> s;
bool viz[100100];
int n,start[100100];
inline void read_buffer(istream& in,int& x) {
	do {if(++bufferIndex==MaxBuffer) {
			bufferIndex=0;
			in.read(buffer,MaxBuffer);
			}
	}while( buffer[bufferIndex]<'0'||buffer[bufferIndex]>'9' ); 

	for(x=0;buffer[bufferIndex]>='0'&&buffer[bufferIndex]<= '9';) {
		x=x*10+buffer[bufferIndex]-'0';
		if(++bufferIndex==MaxBuffer) {
			bufferIndex=0;
			in.read(buffer,MaxBuffer);
			}
		}
}
void erase_(int nod,int k) {
	for(int i=0;i<v[nod].size();i++)
		if(v[nod][i].first==k&&v[nod][i].second==1) {
			v[nod][i].second=0;
			break;
			}
}
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].first;
			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,ok;
	while(!s.empty()) {
		nod=s.top();
		ok=1;
		for(;start[nod]<v[nod].size();start[nod]++)
			if(v[nod][start[nod]].second) {
				v[nod][start[nod]].second=0;
				vecin=v[nod][start[nod]].first;
				erase_(vecin,nod);
				s.push(vecin);
				start[nod]++;
				ok=0;
				break;
				}
		if(ok)
			sol.push_back(nod),s.pop(),ok=0;
		}
}
void citire() {
	int i,x,y,m;
	ifstream in("ciclueuler.in");
	read_buffer(in,n);read_buffer(in,m);
	for(i=0;i<m;i++) {
		read_buffer(in,x);read_buffer(in,y);
		v[x].push_back(pair<int,bool>(y,1));
		v[y].push_back(pair<int,bool>(x,1));
		}
	in.close();
}
int main() {
	citire();
	if(valid()) {
		s.push(1);
		DFS();
		afis(1);
		}
	else afis(-1);
	return 0;
}