Cod sursa(job #470943)

Utilizator dianadobrescuDobrescu Diana dianadobrescu Data 16 iulie 2010 11:46:03
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include<fstream>
#include<list>
#include<iostream>
#define NMAX 100005
#define MMAX 500005

using namespace std;

int c1[MMAX],c[MMAX];
int i,n,m,x,y,k1,k=0,grad[NMAX],viz[NMAX];
list<int> a[NMAX];
typedef list<int>::iterator ITL;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

void DFS(int nod)
{
	ITL it;	
	viz[nod]=1;
	for (it=a[nod].begin();it!=a[nod].end();it++)
		if (!viz[*it])DFS(*it);
}

bool verifica()
{
	int i;
	for (i=1;i<=n;i++)
		if (!viz[i]||grad[i]%2)return 0;//daca nodul i nu este vizitat sau daca  gradul este impar atunci se iese
	return 1;
}

void ciclu(int x , int LOC)
{
	ITL it;
	int vl,j;
	while( c1[k1]!=c1[1] || c1[k1]==c1[1] && k1==1)
	{
		x=c1[k1];
		vl=*a[x].begin();
		a[x].pop_front();
		//cout<<x<<" "<<vl<<" ";
		for(it=a[vl].begin();it!=a[vl].end();it++)
			if (*it==x) break;
		a[vl].erase(it);//stergem
		for (it=a[vl].begin();it!=a[vl].end();it++)
			cout<<*it<<" ";
		cout<<"\n";
		grad[x]--;grad[vl]--;//modificam gradele
		k1++;c1[k1]=vl;
	}
	for (j=k;j>=LOC;j--) c[j+k1-1]=c[j];
	for (j=1;j<=k1-1;j++) c[j+LOC]=c1[j+1];
}
	
void write(int k)
{
	g<<c[1];
	for (i=2;i<=k;i++)
	    g<<" "<<c[i];
	g<<"\n";
}

int main(){
	
	
	f>>n>>m;
	for (i=1;i<=m;i++)
	{
		f>>x>>y;
		a[x].push_back(y);//adaug nodul y in losta x
		a[y].push_back(x);//adaug nodul x in lista y
		grad[x]++;grad[y]++;//maresc gradele nodurilor
	}
	cout<<"Listele!!!\n";
	ITL it;
	for(i=1;i<=n;i++)
	{
		cout<<"sunt in lista"<<i<<": ";
		for (it=a[i].begin();it!=a[i].end();it++)
			cout<<*it<<" ";
		cout<<"\n";
	}
	
	DFS(1);//declansam parcurgerea grafului
	cout<<"acum programul!!!\n";
	if (!verifica()) g<<"-1\n";
	else
	{
		while (k-1<m)
		{
			for(i=1;i<=k-1;i++)//cautam un nod de plecare
			if (grad[c[i]]>0)break;
			if (k>0)
				{
					c1[1]=c[i];k1=1;
					ciclu(c[i],i);
				}
			else 
				{
					k++;c[k]=1;
					c1[1]=1;k1=1;
					ciclu(1,1);
				}
					
			k=k+k1-1;//modificam lungimea lui c
		}
	}
			
	write(k);//scriem solutia gasita
	
	f.close();
	g.close();
	return 0;
}