Pagini recente » Cod sursa (job #1450718) | Cod sursa (job #404370) | Cod sursa (job #232795) | Cod sursa (job #1048053) | Cod sursa (job #1916868)
#include <iostream> //G este multigraf. Sa se det. daca G este eulerian.
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#define NMAX 100005
using namespace std;
vector<int> V[NMAX], C;
stack<int> S;
int N, M, nodStart;
void citire();
bool conditieGradPar();
void dfsIterativ(int nod);
int main()
{
freopen("ciclueuler.in", "rt", stdin);
freopen("ciclueuler.out", "wt", stdout);
citire();
if(conditieGradPar()==0) cout<<"-1\n";
else dfsIterativ(nodStart);
}
void citire()
{
int u,v;
scanf("%d%d", &N, &M);
for(int i=1; i<=M; i++){
scanf("%d %d", &u, &v);
V[u].push_back(v);
V[v].push_back(u);
}
}
bool conditieGradPar()
{
for(int i=1; i<=N; i++)
if(V[i].size() % 2 == 1)
return 0;
else if(!nodStart) //avem nevoie de un nod din care sa pornim parcurgerea; acesta nu trebuie sa fie izolat
nodStart=i;
return 1;
}
void dfsIterativ(int nod)
{
int nodStiva, vecin;
S.push(nod);
while(!S.empty()) {
nodStiva=S.top();
if( V[nodStiva].size() ){
vecin=V[nodStiva].back();
V[nodStiva].pop_back(); //sterg muchia
V[vecin].erase( find(V[vecin].begin(), V[vecin].end(), nodStiva) );
S.push(vecin);
}
else{
S.pop();
if(S.empty() == false) cout << nodStiva << ' ';
}
}
}