Cod sursa(job #309741)

Utilizator SleepyOverlordPatcas Csaba SleepyOverlord Data 1 mai 2009 00:02:29
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.89 kb
//Code by Patcas Csaba
//Time complexity:
//Space complexity:
//Method:
//Working time:

#include <stdio.h>
#include <ctype.h>
#include <vector>
#include <string> 
#include <set> 
#include <map> 
#include <iostream> 
#include <sstream> 
#include <numeric> 
#include <algorithm> 
#include <cmath> 
#include <queue> 
#include <bitset> 

using namespace std;

#define in_file "ciclueuler.in"
#define out_file "ciclueuler.out"

#define VI vector <int>
#define FORN(i,n) for(int i=0;i<n;++i)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define S size()
#define B begin() 
#define E end() 
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define ALL(x) x.begin(),x.end()
#define repeat do{ 
#define until(x) }while(!(x)); 

struct Tedge
{
	int node1, node2, tip;
	bool deleted;
};

vector <Tedge> edges;
VI start, solution;
int n, m;
vector <bool> was;

bool operator< (const Tedge& a, const Tedge& b)
{
	return (a.node1 < b.node1 || a.node1 == b.node1 && a.node2 < b.node2);
}

void MarkEdge(int ind, int t)
{
	if (edges[ind].tip) return ;
	edges[ind].tip= t;
	Tedge aux;
	aux.node1=edges[ind].node2;
	aux.node2=edges[ind].node1;
	int i= lower_bound(ALL(edges), aux) - edges.B;
	while (edges[i].tip) ++i;
	edges[i].tip = t;
}

void MarkDeleted(int ind)
{
	edges[ind].deleted= true;
	Tedge aux;
	aux.node1=edges[ind].node2;
	aux.node2=edges[ind].node1;
	int i= lower_bound(ALL(edges), aux) - edges.B;
	while (edges[i].deleted) ++i;
	edges[i].deleted= true;
}

void Df(int node)
{
	was[node]= true;
	int i= start[node];
	repeat
		int aux=edges[i].node2;
		if (!was[aux]) 
		{
			MarkEdge(i, 1);
			Df(aux);
		}
		else MarkEdge(i, -1);
		++i;
	until (i==edges.S || edges[i].node1 != node);
}

void Fleury(int node)
{
	solution.PB(node);
	FOR(i, start[node], start[node + 1] - 1)
		if (!edges[i].deleted && edges[i].tip == -1)
		{
			MarkDeleted(i);
			Fleury(edges[i].node2);
		}
	FOR(i, start[node], start[node + 1] - 1)
		if (!edges[i].deleted && edges[i].tip == 1)
		{
			MarkDeleted(i);
			Fleury(edges[i].node2);
		}
}

void solve()
{
	was.resize(n+1);
	Df(1);
	FOR(i, 1, n)
		if (!was[i]) return ;
	Fleury(1);
}

int main()
{
	FILE* fin= fopen(in_file, "r");
	fscanf(fin, "%d%d", &n, &m);
	FORN(i, m)
	{
		int x, y;
		fscanf(fin, "%d %d", &x, &y);
		Tedge aux;
		aux.node1=x;
		aux.node2=y;
		aux.deleted=false;
		aux.tip=0;
		edges.PB(aux);
		aux.node1=y;
		aux.node2=x;
		aux.deleted=false;
		aux.tip=0;
		edges.PB(aux);
	}
	fclose(fin);

	sort(ALL(edges));
	start.resize(n+1, -1);
	FORN(i, edges.S)
		if (start[edges[i].node1] == -1) start[edges[i].node1]= i;
	start.PB(edges.S);
	solve();

	FILE* fout= fopen(out_file, "w");
	if (!solution.S || solution.S != m + 1) fprintf(fout, "-1");
	else FORN(i, solution.S) fprintf(fout, "%d ", solution[i]);
	fclose(fout);
	
	return 0;
}