Pagini recente » Cod sursa (job #540469) | Cod sursa (job #146324) | Cod sursa (job #69969) | Cod sursa (job #315436) | Cod sursa (job #1359528)
#include<stdio.h>
#include<algorithm>
#include<stack>
#include<vector>
#define MAXN 100005
#define MAXM 500005
FILE *f=fopen("ciclueuler.in","r"), *g=fopen("ciclueuler.out","w");
using namespace std;
long int N, M, viz[MAXM], nrvecini[MAXN];
// viz[ i ] = daca a fost luata muchia, i = ind [ ceva ]
vector <int> v[MAXN]; // lista de vecini
vector <int> ind[MAXN]; // indicii muchiilor
stack <int> ST; // stiva
void Citire(){
long int i, x, y;
fscanf(f,"%ld %ld\n",&N,&M);
for(i=1;i<=M;i++){
fscanf(f,"%ld %ld\n",&x,&y);
v[x].push_back(y); ind[x].push_back(i);
v[y].push_back(x); ind[y].push_back(i);
nrvecini[x]++; nrvecini[y]++;
}
}
bool EsteEulerian(){
long int i, j, Q[MAXN], k1, k2, VIZ[MAXN], nod;
for(i=1;i<=N;i++) if( nrvecini[i] %2 == 1 ) return 0;
for(i=1;i<=N;i++) VIZ[i]=0;
k1 = 1; k2 = 1; Q[1]=1; VIZ[1]=1;
while( k1 <= k2 ){
nod = Q[k1];
for(j=0;j<v[nod].size();j++)
if( VIZ[v[nod][j]] == 0 ){ Q[++k2] = v[nod][j]; VIZ[ Q[k2] ]=1; }
k1++;
}
for(i=1;i<=N;i++) if( VIZ[i]==0 ) return 0;
return 1;
}
void Rezolva(){
long int nod, Afis=0;
ST.push(1);
while( !ST.empty() ){
nod = ST.top();
if( nrvecini[nod]==0 ){ fprintf(g,"%ld ",nod); ST.pop(); Afis++; if(Afis==M) return; }
else{
while( viz [ ind [nod][ v[nod].size()-1 ] ] == 1 ) // Muchie luata
v[nod].erase( v[nod].end()-1 );
ST.push( v[nod][ v[nod].size()-1 ] ); // Pun ultimul vecin
viz [ ind[nod][ v[nod].size()-1 ] ]=1;
nrvecini[nod]--; nrvecini[ v[nod][ v[nod].size()-1 ] ]--; // Sterg din nrvecini
v[nod].erase( v[nod].end()-1 );
}
}
}
int main(){
Citire();
if( !EsteEulerian() ) fprintf(g,"-1\n");
else Rezolva();
fclose(f); fclose(g);
return 0;
}