Pagini recente » Istoria paginii runda/wintership | Cod sursa (job #2028766) | Monitorul de evaluare | Cod sursa (job #993919) | Cod sursa (job #1506953)
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
#define MMAX 500007
#define NMAX 100007
#define DIM 10007
#define pb push_back
using namespace std;
int n, m, aux, sze, poz;
char viz[MMAX], buff[DIM];
struct muchie
{
int x;
int y;
} E[MMAX];
vector <int> adj[NMAX], sol;
stack <int> dfs;
void citeste(int &nr)
{
nr = 0;
while(buff[poz] < '0' || buff[poz] > '9')
{
++poz;
if(poz == DIM)
{
fread(buff, 1, DIM, stdin);
poz = 0;
}
}
while(buff[poz] >= '0' && buff[poz] <= '9')
{
nr = nr*10 + buff[poz]-'0';
++poz;
if(poz == DIM)
{
fread(buff, 1, DIM, stdin);
poz = 0;
}
}
}
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
citeste(n);
citeste(m);
for(int i = 1; i<= m; ++i)
{
citeste(E[i].x);
citeste(E[i].y);
adj[E[i].x].pb(i);
adj[E[i].y].pb(i);
}
for(int i = 1; i<= n; ++i)
{
if(adj[i].size()&1)
{
printf("-1\n");
return 0;
}
}
dfs.push(1);
while(!dfs.empty())
{
int nod = dfs.top();
sze = adj[nod].size();
while(viz[adj[nod][0]] && !adj[nod].empty())
{
swap(adj[nod][0], adj[nod][sze-1]);
adj[nod].pop_back();
--sze;
}
if(!sze)
{
sol.pb(nod);
dfs.pop();
continue;
}
viz[adj[nod][0]] = 1;
if(nod != E[adj[nod][0]].x) aux = E[adj[nod][0]].x;
else aux = E[adj[nod][0]].y;
dfs.push(aux);
swap(adj[nod][0], adj[nod][sze-1]);
adj[nod].pop_back();
--sze;
}
sze = sol.size();
for(int i = 0; i< sze; ++i) printf("%d ", sol[i]);
printf("\n");
return 0;
}