Pagini recente » Cod sursa (job #132252) | Cod sursa (job #1881590) | Cod sursa (job #1893430) | Cod sursa (job #2874645) | Cod sursa (job #557588)
Cod sursa(job #557588)
#include <algorithm>
#include <fstream>
#include <vector>
#include <stack>
#define Nmax 500010
using namespace std;
stack <int> c; //stiva cu noduri
int ce[Nmax]; //solutia
vector<int> a[100001];
int nr,k;
void ciclu(int x)
{ int nr=x,z; //salvam nodul de start
do{ if(a[x].size()){ //daca nodul are vecin
c.push(a[x][0]); //adaugam nodul in stiva pentru (incercam sa formam un nou ciclu din el)
z = a[x][0];
a[z].erase(find(a[z].begin(), a[z].end(), x)); //stergem muchia de la z la x
a[x].erase(a[x].begin()); //stergem muchia de la x la z
x = z; //ne mutam in nodul z
}
} while (x!=nr); //cat timp nu am ajuns in nodul de inceput (!ciclu)
ce[++k]=nr; //adaugam nodul curent la solutie
c.pop(); //stergem nodul curent din stiva
}
int main(){
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
int N, M;
scanf("%d%d",&N,&M);
for (int i = 1; i <= M; i++)
{ int x, y;
scanf("%d%d",&x,&y);
a[x].push_back(y),a[y].push_back(x);
}
for (int i = 1; i <= N; i++)
if (a[i].size() % 2) //daca un nod are gr impar
{printf("-1"); return 0;} //nu este eulerian
c.push(1),k=0;
do
if (a[c.top()].size() > 0) //daca nodul curent are muchii nefolosite
ciclu(c.top()); //putem forma un nou ciclu
else ce[++k]=c.top(),c.pop(); //altfel adaugam nodul curent la sol, trecem la nod anterior
while (c.size()!=1);
if(k!=M) //daca nu am folosit toate muchiile
{printf("-1"); return 0;} //nu este eulerian
for (int i = 1; i <= k; i++) //afisam nodurile din ciclu
printf("%d ",ce[i]);
return 0;
}