Pagini recente » Pufu | Profilul magnific al lui razviii237 | Prietenie2 | Profil SorbanElod | Cod sursa (job #698972)
Cod sursa(job #698972)
// ciclu eulerian
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#define NMAX 100011
using namespace std;
vector <int> G[NMAX];
queue <int> Q;
stack <int> S;
vector <int>::iterator it;
int N;
int grad[NMAX],viz[NMAX];
void Read(){
int x,y,M;
ifstream in("ciclueuler.in");
in>>N>>M;
for(;M>0;M--){
in>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
grad[x]++;
grad[y]++;
}
in.close();
}
bool Conex(){
int x,Nr=0;
Q.push(1);
while(!Q.empty()){
x=Q.front();
Q.pop();
for(it=G[x].begin();it!=G[x].end();it++)
if(!viz[*it]){
viz[*it]=1;
Nr++;
Q.push(*it);
}
}
if(Nr==N) return 1;
return 0;
}
bool Par(){
for(int i=1;i<=N;i++)
if(grad[i]%2) return 0;
return 1;
}
void Erase(int x, int y){
int i;
grad[x]--; grad[y]--;
for(it=G[x].begin();it!=G[x].end();it++)
if(*it==y){
G[x].erase(it);
break;
}
for(it=G[y].begin();it!=G[y].end();it++)
if(*it==x){
G[y].erase(it);
break;
}
}
void Euler(int x){
while(1){
if(G[x].size()==0) break;
int y=G[x][0];
S.push(x);
Erase(x,y);
x=y;
}
}
void Solve(int x){
do{
Euler(x);
x=S.top();
S.pop();
Q.push(x);
}
while(!S.empty());
}
void Write(){
ofstream out("ciclueuler.out");
int conex,par;
conex=Conex();
par=Par();
if(conex&&par){
Solve(1);
while(!Q.empty()){
out<<Q.front()<<" ";
Q.pop();
}
}
else out<<"-1\n";
out.close();
}
int main(){
Read();
Write();
return 0;
}