Pagini recente » Cod sursa (job #3180177) | Cod sursa (job #1375000) | Cod sursa (job #755988) | Cod sursa (job #3189827) | Cod sursa (job #2343496)
#include <bits/stdc++.h>
using namespace std;
ifstream f("ciclueuler.in"); ofstream g("ciclueuler.out");
const int MAXN = 100000 + 16;
const int MAXM = 500000 + 16;
vector < pair < int, int > > Edge[MAXN],returnBranch[MAXN];
bitset < MAXM > VizM;
bitset < MAXN > VizN;
stack < unsigned int > ST,iterate;
int N,M,Deg[MAXN];
void citire()
{ f>>N>>M;
for(int a,b,i=1;i<=M;++i)
{ f>>a>>b;
Edge[a].push_back(make_pair(b, i));
Edge[b].push_back(make_pair(a, i));
++Deg[a]; ++Deg[b];
}
}
inline bool isValid()
{ for(int i=1;i<=N;++i)
if(Deg[i]&1) return false;
return true;
}
void dfs(int rad)
{ ST.push(rad);
iterate.push(0);
while(!ST.empty())
{ int nod=ST.top();
int poz=iterate.top();
VizN.set(nod);
while((unsigned)poz < Edge[nod].size() && VizM.test(Edge[nod][poz].second)) ++poz;
if((unsigned)poz >= Edge[nod].size()) {ST.pop(); iterate.pop();}
else
{ int next=Edge[nod][poz].first;
int id=Edge[nod][poz].second;
VizM.set(id);
iterate.top()=++poz;
if(VizN.test(next))
{ returnBranch[nod].push_back(make_pair(next, id));
returnBranch[next].push_back(make_pair(nod, id));
}
else {ST.push(next); iterate.push(0);}
}
}
}
void createEuler(int nod)
{ for(int i=1;i<=M;++i)
{ g<<nod<<' ';
bool need=true;
if(!returnBranch[nod].empty())
{ need=false;
while(!returnBranch[nod].empty() && VizM.test(returnBranch[nod].back().second))
returnBranch[nod].pop_back();
if(!returnBranch[nod].empty())
{ int next=returnBranch[nod].back().first;
VizM.set(returnBranch[nod].back().second);
returnBranch[nod].pop_back();
nod=next;
}
else need=true;
}
if(need)
{ while(!Edge[nod].empty() && VizM.test(Edge[nod].back().second)) Edge[nod].pop_back();
int next=Edge[nod].back().first;
VizM.set(Edge[nod].back().second);
Edge[nod].pop_back();
nod=next;
}
}
}
int main()
{ citire();
if(isValid()) {dfs(1); createEuler(1);} else g<< "-1\n";
g.close(); return 0;
}