Pagini recente » Cod sursa (job #2601860) | Cod sursa (job #2743486) | Cod sursa (job #1672860) | Cod sursa (job #210704) | Cod sursa (job #614742)
Cod sursa(job #614742)
#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; }
if(par&&conex) rezolva(1); else fo<<"-1\n";
return 0;
}