Pagini recente » Cod sursa (job #2740082) | Cod sursa (job #1958955) | Cod sursa (job #1207593) | Cod sursa (job #1394781) | Cod sursa (job #1359551)
#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 < pair<int,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( make_pair(y,i) );
v[y].push_back( make_pair(x,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].first] == 0 ){ Q[++k2] = v[nod][j].first; 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 [ v[nod][ v[nod].size()-1 ].second ] == 1 ) // Muchie luata
v[nod].erase( v[nod].end()-1 );
ST.push( v[nod][ v[nod].size()-1 ].first ); // Pun ultimul vecin
viz [ v[nod][ v[nod].size()-1 ].second ]=1;
nrvecini[nod]--; nrvecini[ v[nod][ v[nod].size()-1 ].first ]--; // 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;
}