Pagini recente » Cod sursa (job #1216154) | Cod sursa (job #184105) | Cod sursa (job #1843012) | Cod sursa (job #2584653) | Cod sursa (job #2734338)
#include <bits/stdc++.h>
using namespace std;
class InParser {
private:
FILE *fin;
char *buff;
int sp;
char read_ch() {
++sp;
if (sp == 4096) {
sp = 0;
fread(buff, 1, 4096, fin);
}
return buff[sp];
}
public:
InParser(const char* nume) {
fin = fopen(nume, "r");
buff = new char[4096]();
sp = 4095;
}
InParser& operator >> (int &n) {
char c;
while (!isdigit(c = read_ch()) && c != '-');
int sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser& operator >> (long long &n) {
char c;
n = 0;
while (!isdigit(c = read_ch()) && c != '-');
long long sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
};
InParser f("ciclueuler.in");
ofstream g("ciclueuler.out");
const int M=5e5+5,N=1e5+5;
struct muchie{
int x,y;
bool folosit;
};
int vf[2*M],urm[2*M],lst[N],nr,stiva[N];
muchie e[M];
vector <int> a[N],c;
/*void euler(int x)
{
//for(auto i:a[x])
for(int p=lst[x];p!=0;p=urm[p])
{
int i=vf[p];
if(e[i].folosit)
{
continue;
}
e[i].folosit=true;
int y=e[i].x+e[i].y-x;
euler(y);
}
c.push_back(x);
}*/
void euler()
{
int vf=0;
stiva[++vf]=1;
while (vf > 0)
{
int x=stiva[vf];
bool gasit=false;
for(int j=a[x].size()-1;j>=0;j--)
{
int i = a[x][j];
a[x].pop_back();
if(e[i].folosit)
{
continue;
}
e[i].folosit=true;
int y=e[i].x+e[i].y- x;
stiva[++vf]=y;
gasit=true;
break;
}
if(!gasit)
{
c.push_back(x);
vf--;
}
}
}
/*void adauga(int x,int i)
{
vf[++nr]=i;
urm[nr]=lst[x];
lst[x]=nr;
}*/
int gr[N];
int n,m;
bool verifica()
{
for(int i=1;i<=n;i++)
{
if(gr[i]%2==1)
return 0;
}
return 1;
}
int main()
{
f>>n>>m;
for(int i=0;i<m;i++)
{
f>>e[i].x>>e[i].y;
gr[e[i].x]++;
gr[e[i].y]++;
a[e[i].x].push_back(i);
//adauga(e[i].x,i);
a[e[i].y].push_back(i);
//adauga(e[i].y,i);
}
if(!verifica())
{
g<<-1;
return 0;
}
euler();
if(c.size()==m+1 && c[0]==c[m])
{
c.erase(c.begin()+m);
for(auto i:c)
{
g<<i<<" ";
}
}
else
{
g<<-1;
}
g.close();
return 0;
}