Pagini recente » Cod sursa (job #413651) | Cod sursa (job #1163510) | Cod sursa (job #688177) | Cod sursa (job #2546270) | Cod sursa (job #3281222)
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
vector<pair<int, int>> mat[100005];
int grade[100005], viz[100005], vizMuchii[500005], muchieCrt[100005];
vector<int> euler;
void dfs(int nod)
{
viz[nod]=1;
for(auto x:mat[nod]) //cat timp x este in graf, daca
if(!viz[x.first])
dfs(x.first);
}
void construire(int nod)
{
while(muchieCrt[nod]<mat[nod].size()) //cat timp mai pot procesa muchii
{
pair<int, int>muchie=mat[nod][muchieCrt[nod]]; //imi iau muchia cu vecin, indice muchie
muchieCrt[nod]++;
if(vizMuchii[muchie.second])
continue; //daca am vizitat deja muchia, nu facem nimic.. (verific dupa indice in vizMuchii
else
vizMuchii[muchie.second]=1;
construire(muchie.first); //continui recursivitate cu urmatorul nod
}
euler.push_back(nod); //bagam nodul in vector pt afisare
}
int main()
{
int n,m, i;
cin>>n>>m;
for(i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
mat[x].push_back({y,i}); //setez muchiile+INDICI
mat[y].push_back({x,i});
grade[x]++;
grade[y]++;
}
dfs(1);
for(i=1;i<=n;i++)
if(viz[i]==0 || grade[i]%2!=0) //verificam daca avem ciclu euler
cout<<-1;
construire(1); //pt ca incepem de la nod 1
euler.pop_back();//elimin ultimul 1
//for(auto x:euler)
//cout<<x<<" ";
for(i=1;i<=euler.size(); i++)
cout<<euler[i]<<" ";
return 0;
}