Pagini recente » Cod sursa (job #2152581) | Cod sursa (job #248609) | Cod sursa (job #2631481) | Cod sursa (job #2438294) | Cod sursa (job #614703)
Cod sursa(job #614703)
#include <fstream>
#include <stack>
#include <vector>
#include <queue>
using namespace std;
ifstream fi("ciclueuler.in");
ofstream fo("ciclueuler.out");
vector<int>::iterator st;
vector<int> v[100002];
queue<int>Q;
stack<int>S;
int n,m,deg[100002];
bool viz[100002],conex,par;
void sterge(int x,int y)
{
int i;
deg[x]--; deg[y]--;
for(i=0;i<v[x].size();i++) if(v[x][i]==y) break;
st=v[x].begin()+i;
v[x].erase(st);
for(i=0;i<v[y].size();i++) if(v[y][i]==x) break;
st=v[y].begin()+i;
v[y].erase(st);
}
void euler(int x)
{
while(1)
{
if(v[x].size()==0) break;
int y=v[x][0];
S.push(x);
sterge(x,y);
x=y;
}
}
void rezolva()
{
int x;
do
{
euler(x);
x=S.top(); S.pop();
Q.push(x);
} while(!S.empty());
while(!Q.empty())
{
fo<<Q.front()<<" ";
Q.pop();
}
}
int main()
{
int i,x,y;
fi>>n>>m;
for(i=1;i<=m;i++)
{
fi>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
deg[x]++;
deg[y]++;
}
viz[1]=0;
Q.push(1);
while(!Q.empty())
{
x=Q.front();
Q.pop();
for(i=0;i<v[x].size();i++)
if(!viz[v[x][i]])
{
viz[v[x][i]]=1;
Q.push(v[x][i]);
}
}
conex=1;
for(i=2;i<=n;i++) if(!viz[i]) { conex=0; break; }
par=1;
for(i=1;i<=n;i++) if(deg[i]%2) { par=0; break; }
x=1;
if(par&&conex) rezolva(); else fo<<"-1\n";
return 0;
}