Pagini recente » Cod sursa (job #2404567) | Cod sursa (job #2119898) | Cod sursa (job #1805499) | Cod sursa (job #1450868) | Cod sursa (job #2457295)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
vector <pair <int,int> > G[100005];
stack <int> S;
bitset <500005> B;
int n,m;
void citire()
{
fin>>n>>m;
for(int i=1; i<=m; i++)
{
int x,y;
fin>>x>>y;
G[x].push_back({i,y});
G[y].push_back({i,x});
}
}
void euler()
{
S.push(1);
while(!S.empty())
{
int x=S.top();
int ok=0;///inca n-am facut ciclu;
while(G[x].size()&&B[G[x].back().first]) ///daca elementul luat de la coada listei de vecini are muchia parcursa , o eliminam
G[x].pop_back();
if(!G[x].empty())
{
int vecin=G[x].back().second;
B[G[x].back().first]=1;///folosim muchia in ciclu;
ok=1;///am ggasit cu ce sa continuam
G[x].pop_back();///eliminam muchia
S.push(vecin); ///punem elementul in ciclu
}
if(!ok)///daca n am continuat afisam si ne intoarcem
{
S.pop();
if(!S.empty()) fout<<S.top()<<" ";
}
}
}
void rezolva()
{
int ok=0;
for(int i=1; i<=n; i++)
if(G[i].size()%2) {ok=1; fout<<"-1";}
if(!ok)
euler();
}
int main()
{
citire();
rezolva();
return 0;
}