Pagini recente » Cod sursa (job #1162451) | Cod sursa (job #2858246) | Cod sursa (job #1187058) | Cod sursa (job #2382674) | Cod sursa (job #1650614)
#include<stdio.h>
#include<algorithm>
#include<vector>
#define MAXN 100005
#define MAXM 500005
FILE *f=fopen("ciclueuler.in","r"), *g=fopen("ciclueuler.out","w");
using namespace std;
vector <int> v[MAXN];
int N, M, ST[MAXM], hST, viz[MAXM], SOL[MAXM], lSOL = 0;
void Citire(){
int i, X, Y;
fscanf(f,"%d %d\n",&N,&M);
for(i=1;i<=M;i++){
fscanf(f,"%d %d\n",&X,&Y);
v[X].push_back(Y);
v[Y].push_back(X);
}
}
void DFS( int start ){
int i, nod, NEWnod, Q[MAXN], st, fn;
st = 1;
fn = 0;
Q[++fn] = start;
viz[ start ] = 1;
while( st <= fn ){
nod = Q[st];
for(i=0;i<v[nod].size();i++){
NEWnod = v[nod][i];
if( viz[NEWnod] == 0 ){
Q[++fn] = NEWnod;
viz[NEWnod] = 1;
}
}
st++;
}
}
bool Verif(){
int i;
for(i=1;i<=N;i++)
if( v[i].size() %2 != 0 )
return 0;
DFS(1);
for(i=1;i<=N;i++)
if( viz[i] != 1 )
return 0;
return 1;
}
void Rezolvare(){
int i, nod, NEWnod;
hST = 0;
ST[++hST] = 1;
while( hST > 0 ){
nod = ST[hST];
if( v[nod].size() > 0 ){
NEWnod = v[nod][ v[nod].size()-1 ];
ST[++hST] = NEWnod;
v[nod].pop_back();
v[NEWnod].erase( find( v[NEWnod].begin(), v[NEWnod].end(), nod ) );
}
else
{SOL[++lSOL] = nod;
hST--;}
}
for(i=1;i<=lSOL-1;i++)
fprintf(g,"%d ",SOL[i]);
}
int main(){
Citire();
if( Verif() == 0 ){ fprintf(g,"-1\n"); return 0; }
Rezolvare();
return 0;
}