Pagini recente » Cod sursa (job #1341305) | Cod sursa (job #789993) | Cod sursa (job #2822843) | Cod sursa (job #2428442) | Cod sursa (job #309741)
Cod sursa(job #309741)
//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;
}