Pagini recente » Istoria paginii runda/cristicreste1/clasament | Cod sursa (job #2805956) | Cod sursa (job #48867) | Cod sursa (job #2821869) | Cod sursa (job #2681333)
#include <fstream>
#include <vector>
#include <stack>
#define MMAX 500005
#define NMAX 100005
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
struct muchie{
int x, y;
bool vizmuchie = false;
}muchii[MMAX];
vector<int>graph[NMAX];
stack<int>ciclu;
int n, m, viz[NMAX];
int d[NMAX];
void citire(){
f>>n>>m;
int x, y;
for(int i=0; i<m; i++){
f>>x>>y;
muchii[i].x = x;
muchii[i].y = y;
graph[x].push_back(i);
graph[y].push_back(i);
d[x] ++;
d[y] ++;
}
}
void parcurgere(int vf){
viz[vf] = 1;
for(auto &m:graph[vf]){
int nod = (muchii[m].x == vf)?muchii[m].y:muchii[m].x;
if(viz[nod] == 0)
parcurgere(nod);
}
}
int verif(){
for(int i=1; i<=n; i++){
if(d[i]%2 != 0 || (viz[i] == 0 && d[i]!=0))
return 0;
}
return 1;
}
void euler(){
ciclu.push(1);
while(!ciclu.empty()){
int x = ciclu.top();
if(!graph[x].empty()){
int m = graph[x].back();
graph[x].pop_back();
if(muchii[m].vizmuchie == false){
int y = (muchii[m].x == x)?muchii[m].y:muchii[m].x;
ciclu.push(y);
muchii[m].vizmuchie = true;
}
}
else{
if(ciclu.size() > 1)
g<<x<<" ";
ciclu.pop();
}
}
}
int main()
{
citire();
parcurgere(1);
if(verif() == 0){
g<<"-1";
}
else euler();
return 0;
}