Pagini recente » Cod sursa (job #3171933) | Cod sursa (job #2043000) | Cod sursa (job #2818995) | Cod sursa (job #1821127) | Cod sursa (job #1622435)
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int N, M, x, y, k, A[100010];
bitset<500010>v;
vector< pair <int, int> >L[100010];
stack<int> Q;
void dfs(int node)
{
v[node] = 1;
for(int i = 0; i < L[node].size(); i ++)
{
if(v[ L[node][i].first ] == 0)
{
dfs(L[node][i].first);
}
}
}
int main()
{
fin >> N >> M;
for(int i = 1; i <= M; i ++)
{
int x, y;
fin >> x >> y;
L[x].push_back(make_pair(y, i));
L[y].push_back(make_pair(x, i));
A[x] ++;
A[y] ++;
}
for(int i = 1; i <= N; i ++)
{
if(v[i] == 0)
{
dfs(i);
k = i;
break;
}
}
for(int i = 1; i <= N; i ++)
{
if( (A[i] % 2) || (v[i] == 0 && A[i]) )
{
fout << -1;
return 0;
}
}
v.reset();
Q.push(k);
bool ok = true;
while(!Q.empty())
{
k = Q.top();
if(A[k] == 0)
{
if(ok == false)
{
fout << k << " ";
}
ok = false;
Q.pop();
continue;
}
while(v[ L[k][ L[k].size() - 1].second ] == 1)
{
L[k].pop_back();
}
v[ L[k][ L[k].size() - 1].second ] = 1;
Q.push(L[k][ L[k].size() - 1].first);
A[k] --;
A[ L[k][ L[k].size() - 1 ].first ] --;
L[k].pop_back();
}
return 0;
}