Cod sursa(job #766252)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 10 iulie 2012 18:39:38
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<iostream>
#include<fstream>
#include<stack>
#include<list>
#include<bitset>
using namespace std;

#define NMAX 9

struct piesa {
	int poz,d;
	inline piesa (int _poz, int _d)
	{
		poz=_poz;
		d=_d;
	}
};

list <int> v[100001],a;
list <piesa> d[NMAX+1][NMAX+1];
int gr[100001],n,m,start,l;
bitset <100001> viz;
stack <int> s;

inline int conex()
{
	int i,x,y;
	x=-1;
	y=-1;
	for(i=1;i<=n;i++)
		if(gr[i]%2==1) {
			if(x==-1)
				x=i;
			else if(y==-1)
				y=i;
			else return 0;
		}
	if(x!=-1) {
		v[x].push_back(y);
		v[y].push_back(x);
	}
	return 1;
}

inline void sterge(int x, int y)
{
	for(list <int> :: iterator it=v[x].begin();it!=v[x].end();it++)
		if(*it==y) {
			v[x].erase(it);
			return;
		}
}

inline void euler(int nod)
{
	int x;
	while(v[nod].empty()==0) {
		x=v[nod].front();
		v[nod].pop_front();
		sterge(x,nod);
		s.push(nod);
		nod=x;
	}
}
int main ()
{
	int i,x,y,j;
	ifstream f("domino.in");
	ofstream g("domino.out");
	f>>m;
	start=-1;
	n=0;
	for(i=1;i<=m;i++) {
		f>>x>>y;
		if(start==-1)
			start=x;
		v[x].push_back(y);
		v[y].push_back(x);
		if(x>n)
			n=x;
		if(y>n)
			n=y;
		gr[x]++;
		gr[y]++;
		d[x][y].push_back(piesa(i,0));
		d[y][x].push_back(piesa(i,1));
	}
	f.close();
	if(conex()) {
		do {
			euler(start);
			start=s.top();
			s.pop();
			a.push_back(start);
		}while(s.empty()==0);
		g<<"1"<<'\n';
		a.push_back(a.front());
		x=a.front();
		list <int> :: iterator it=a.begin();
		for( ++it ;it!=a.end();it++) {
			g<<d[x][*it].front().poz<<" "<<d[x][*it].front().d<<'\n';
			y=d[x][*it].front().poz;
			d[x][*it].pop_front();
			for(list <piesa> :: iterator itt=d[*it][x].begin();itt!=d[*it][x].end();itt++)
				if(itt->poz==y) {
					d[*it][x].erase(itt);
					break;
				}
			x=*it;
		}
	}
	else {
		while(1);
		g<<"0";
	}
	g.close();
	return 0;
}