Pagini recente » Cod sursa (job #2968406) | Cod sursa (job #2806775) | Cod sursa (job #1810612) | Cod sursa (job #1062425) | Cod sursa (job #2432913)
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <stack>
std::ifstream fin("ciclueuler.in");
std::ofstream fout("ciclueuler.out");
struct edge
{
int dest, ind;
};
std::list<edge> v[100500];
std::list<edge>::iterator t[100500];
bool hasEdge[500500];
int n,m;
std::stack<int> s;
int grad[100500];
std::vector<int> rez;
int main()
{
fin>>n>>m;
for(int i=0;i<m;i++)
{
int j,k;
fin>>j>>k;
v[j].push_back({k,i});
grad[j]++;
grad[k]++;
if(j!=k)
v[k].push_back({j,i});
hasEdge[i]=true;
}
for(int i=1;i<=n;i++)
{
t[i]=v[i].begin();
if(grad[i]%2!=0)
{
fout<<"-1\n";
return 0;
}
}
s.push(1);
while(!s.empty())
{
int tp = s.top();
std::list<edge>::iterator it=t[tp];
for(; it!= v[tp].end();)
{
t[tp]=it;
if(t[tp]!= v[tp].end())
t[tp]++;
if(!hasEdge[it->ind])
{
++it;
continue;
}
s.push(it->dest);
hasEdge[it->ind]=false;
break;
}
if(t[s.top()]== v[s.top()].end())
{
rez.push_back(s.top());
s.pop();
}
}
for(int i=0;i<rez.size()-1;i++)
fout<<rez[i]<<" ";
}