Cod sursa(job #726337)

Utilizator hunter_ionutzzzFarcas Ionut hunter_ionutzzz Data 27 martie 2012 10:21:04
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.68 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
#define lung 500001

int n,m,st[lung],grad[lung];
queue<int> Q;
vector< pair<int,int> > G[Nmax];
bool viz[lung];
void read()
{	fscanf(f,"%d%d",&N,&M);
	
	int i,x,y;
	for(i=1;i<=M;++i)
	{
		fscanf(f,"%d%d",&x,&y);
		G[x].push_back(make_pair(y,i));
		G[y].push_back(make_pair(x,i));
		++gr[x];
		++gr[y];
	}
	
	fclose(f);
}
void df(int x)
{
	viz[x] = true;
	for(vector< pair<int,int> >::iterator it = G[x].begin();it!=G[x].end();++it)
		if(viz[it->first] == false)
			df(it->first);
}
void euler()
{
	st[++st[0]] = 1;
	viz.reset();
	
	int nod,vec,ind;
	
	while(st[0])
	{
		nod = st[st[0]];
		if(G[nod].size() == 0)
		{
			Q.push(nod);
			--st[0];
			continue;
		}
		vec = (G[nod].end()-1)->first;
		ind = (G[nod].end()-1)->second;
		G[nod].pop_back();
		if(viz[ind] == false)
		{
			viz[ind] = true;
			st[++st[0]] = vec;
		}
	}
}
int main()
{int i,x,y;
    fin >> n >> m;
	for(i=1;i<=m;++i)
	{   fin >> x >> y;
		G[x].push_back(make_pair(y,i));
		G[y].push_back(make_pair(x,i));
		++gr[x];
		++gr[y];
	}
	df(1);
	int ok = 1;
	for(int i=1;i<=N;++i)
		if(viz[i] == false || gr[i] % 2 == 1)
			ok = 0;
	if(ok)
	{
		euler();
		for(int i=1, ok = Q.size();i<ok;++i,Q.pop())
			fprintf(g,"%d ",Q.front());
	}
	else
		fprintf(g,"-1");
	fclose(g);
	return 0;
}








/*#include<fstream>
#include<list>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int i,n,m,x,y,grad[100001],aux[100001],sol[100001],nr,mare;
bool viz[100001];
bool ok;
list <int> v[100001];
inline void df(int k)
{   list<int>::iterator it;
    viz[k] = true; 
    for (it=v[k].begin();it!=v[k].end();++it)
		if (!viz[*it])
			df(*it);
}
inline void dft(int k)
{   if (v[k].size())
    {   list <int>::iterator it;
		aux[++nr] = v[k].front();
        it = v[2].begin();
		v[k].pop_front();
		it = v[aux[nr]].begin();
		while (*it != k)
			++it;
		v[aux[nr]].erase(it);
		dft(aux[nr]);
	}
} 
inline void adaug()
{int j;
	for (i=1;i<=n && sol[i]!=aux[1];++i);
	for (j=1;j<=mare-i+1;++j)
    {   sol[mare+j] = sol[i+j-1];
	    sol[i+j-1] = aux[j];
	}
	mare = mare + nr - 1;
	nr=0;
}
int main()
{   fin >> n >> m;
    for (i=1;i<=m;++i)
	{	fin >> x >> y;
	    v[x].push_back(y);
		v[y].push_back(x);
		++grad[x];
		++grad[y];
    }
	df(1);
	for (i=1;i<=n;++i)
		if (!viz[i] && (grad[i] % 2))
		{	fout << "-1";
	        return 0;
		}
	aux[++nr] = 1;
	dft(1);
	for (i=1;i<=nr;++i)
		sol[i] = aux[i];
	mare = nr;
	nr=0;
	while (!ok)
	{   for (i=1;i<=n && !v[i].size();++i);
	    if (i>=n)
		{	for (i=1;i<mare;++i)
				fout << sol[i] << " ";
		    return 0;
		}
		aux[++nr] = i;
		dft(i);
		adaug();
	}
	return 0;
}
*/