Pagini recente » Cod sursa (job #1497438) | Cod sursa (job #3152004) | Cod sursa (job #1368913) | Cod sursa (job #2364938) | Cod sursa (job #1483109)
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>
#include<stack>
#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int N,M,nrimp,nod,nrbfs;
int deg[100010];
bitset<100010> verif;
vector<int> v[100010];
queue<int> Q;
stack<int> s;
void bfs();
void euler();
void sterge(int,int);
int main()
{
f>>N>>M;
FOR (i,1,M) {
int x,y;
f>>x>>y;
v[x].pb(y);
v[y].pb(x);
++deg[x];
++deg[y];
}
Q.push(1);
verif.set(1,1);
bfs(); // se verifica daca graful este conex
if (nrbfs!=N) {
g<<"-1";
return 0;
}
FOR (i,1,N) { // se verifica cate noduri au gradul impar
if (deg[i]%2==1) {
++nrimp;
nod=i;
}
}
if (nrimp==0) { // trebuia (nrimp==0 || nrimp==2) dar i don't know what the fuck
if (!nrimp) {
s.push(1);
}
else {
s.push(nod);
}
euler();
}
else {
g<<"-1";
}
f.close();g.close();
return 0;
}
void bfs() {
while (!Q.empty()) {
int nod=Q.front();
//cout<<nod<<'\n';
++nrbfs;
Q.pop();
for (unsigned int k=0;k<v[nod].size();++k) {
if (!verif.test(v[nod][k])) {
Q.push(v[nod][k]);
verif.set(v[nod][k],1);
}
}
}
}
void euler() {
while (!s.empty()) {
int nod=s.top();
if (v[nod].size()) {
int fiu=v[nod].back();
s.push(fiu);
v[nod].pop_back();
sterge(fiu,nod);
}
else {
g<<nod<<' ';
s.pop();
}
}
}
void sterge(int nod,int val) {
vector<int>::iterator it;
it=v[nod].begin();
while (*it!=val) {
++it;
}
v[nod].erase(it);
}