Pagini recente » Cod sursa (job #1281997) | Winter Challenge 2008 | Cod sursa (job #2506650) | Cod sursa (job #791079) | Cod sursa (job #1358192)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
ifstream F("ciclueuler.in");
ofstream G("ciclueuler.out");
const int N = 100010;
const int M = 500010;
int n,m,deg[N],mk[N],mke[M];
pair<int,int> edges[M];
vector<int> ans,v[N];
vector<int>::iterator it[N];
int _v(int x,int y)
{
return edges[x].first + edges[x].second - y;
}
void dfs(int x)
{
mk[x] = 1;
for (int i=0;i<int(v[x].size());++i)
{
int y = _v(v[x][i],x);
if ( mk[y] == 0 )
dfs(y);
}
}
int main()
{
F>>n>>m;
for (int i=1,x,y;i<=m;++i)
{
F>>x>>y;
edges[i] = make_pair(x,y);
v[x].push_back(i);
v[y].push_back(i);
deg[x]++;
deg[y]++;
}
int ok = 1;
dfs(1);
for (int i=1;i<=n && ok;++i)
if ( deg[i]%2 == 1 || mk[i] == 0 )
ok = 0;
if ( ok )
{
for (int i=1;i<=n;++i)
it[i] = v[i].begin();
vector<int> stk;
stk.push_back( 1 );
while ( !stk.empty() )
{
int x = stk.back();
for (;it[x] != v[x].end();++it[x])
{
if ( mke[*it[x]] ) continue;
int y = _v(*it[x],x);
stk.push_back( y );
++it[x];
break;
}
if ( it[x] == v[x].end() )
{
ans.push_back( stk.back() );
stk.pop_back();
}
}
reverse(ans.begin(),ans.end());
for (int i=0;i<ans.size();++i)
G<<ans[i]<<' ';
G<<'\n';
}
else
{
G<<"-1\n";
}
}