Pagini recente » Cod sursa (job #1225385) | Cod sursa (job #910367) | Cod sursa (job #1645913) | Cod sursa (job #1811698) | Cod sursa (job #1509648)
#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, viz[MAXN], OK;
int ST[MAXM], hST, Ciclu[MAXM], hCiclu = 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 DF( int NODst ){
int Q[MAXN], NOD, NODnou, st, fn, i;
st= 1;
fn = 1;
viz[NODst] = 1;
Q[1] = NODst;
while( st <= fn ){
NOD = Q[st];
for(i=0;i<v[NOD].size();i++)
{
NODnou = v[NOD][i];
if( viz[ NODnou ] == 0 ){
viz[ NODnou ] = 1;
Q[++fn] = NODnou;
}
}
st++;
}
}
int Verificare(){
int i;
for(i=1;i<=N;i++)
if( ( v[i].size() ) % 2 != 0 )
return -1;
for(i=1;i<=N;i++){
if( viz[i] == 0 ){
DF(i);
break;
}
}
for(i=1;i<=N;i++)
if( viz[i] == 0 )
return -1;
return 1;
}
void CicluEuler(){
int i, NOD, NODnou;
ST[1] = 1;
hST = 1;
while( hST > 0 ){
NOD = ST[ hST ];
if( v[NOD].size() != 0 ){
NODnou = v[NOD][ v[NOD].size()-1 ];
v[ NOD ].pop_back(); // Stergerea
v[ NODnou ].erase( find( v[NODnou].begin(), v[NODnou].end(), NOD ) );
ST[++hST] = NODnou;
}
else{
Ciclu[ ++hCiclu ] = NOD;
hST--;
}
}
for(i=1;i<=hCiclu-1;i++)
fprintf(g,"%d ",Ciclu[i]);
}
int main(){
Citire();
OK = Verificare(); // -1 - nu este 1 - este
if( OK == -1 ){ fprintf(g,"-1\n"); return 0; }
CicluEuler();
return 0;
}