Cod sursa(job #950121)

Utilizator BalcauIonutFMI-Balcau Ionut BalcauIonut Data 15 mai 2013 21:25:48
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
// Balcau Ionut - grupa 134
// algoritmul lui Hierholzer pentru determinarea ciclului eulerian
#define NMAX 100001
#define MMAX 500001

using namespace std;
#include <vector>
#include <fstream>
#include <queue>
#include <iostream>
#include <algorithm>
#include <list>
ofstream fout("ciclueuler.out");

vector<int> g[NMAX],sol;
list<int> Sol;
int grad[NMAX];
int n;
void citire(){
	int m,x,y;
	ifstream fin("ciclueuler.in");
	fin>>n>>m;
	while(m--){ 
		fin>>x>>y;
		g[x].push_back(y); ++grad[x];
		g[y].push_back(x); ++grad[y];
	}
}

int conex(){
	bool v[NMAX];
	int i;
	for(i=1;i<=n;++i) v[i]=false;
		queue<int> q;
	q.push(1);
	int s;
	v[1]=true; s=1;
	vector<int>::iterator it;
	while(!q.empty()){
		int x=q.front();
		q.pop(); 
		cout<<x<<"->";
		for(it=g[x].begin();it!=g[x].end();++it) if(!v[*it]){
			q.push(*it);
			v[*it]=true; ++s;
		}
	}
	cout<<"s="<<s<<'\n';
	if(s==n)
		return 1;
	else return 0;

}

int eulerian(){
	for(int i=1;i<=n;++i)
		if(grad[i]%2==1) return 0;
	return 1;
}

void sterge(int x,int y){
	vector<int>::iterator it;
	--grad[x]; --grad[y];
	it=find(g[x].begin(),g[x].end(),y);
	if(it!=g[x].end())
		g[x].erase(it);
	it=find(g[y].begin(),g[y].end(),x);
	if(it!=g[y].end())
		g[y].erase(it);
}

list<int> ciclu(int v){
	list<int> s;
	while( true ){
		if( g[v].empty() )
			break;
		int w = g[v].front();
		s.push_back(v); 
		cout<<v<<"->";
		sterge(v,w);
		v = w;
	}
	return s;
}

void euler(){
	int v;
	list<int> s;
	s=ciclu(1);
	Sol.insert(Sol.begin(),s.begin(),s.end());	

	for(list<int>::iterator it=Sol.begin();it!=Sol.end();it++){
		v=*it;
		if(!g[v].empty()){
			cout<<"@"<<v<<"\n";
			s=ciclu(v);
			// it=Sol.erase(it);
			Sol.insert(it,s.begin(),s.end());
		}

	}
}


int main(){
	citire();
	if(!conex() || !eulerian()){
		fout<<"-1";
		fout.close();
		return 0;
	}else{
		euler();
		for(list<int>::iterator it=Sol.begin();it!=Sol.end();it++){
			fout<<*it<<' ';
		}
	}


}