Pagini recente » Cod sursa (job #547737) | Cod sursa (job #833749) | Cod sursa (job #279328) | Cod sursa (job #2030282) | Cod sursa (job #2509396)
#include <fstream>
#include <vector>
#include <stack>
#define MMAX 500005
#define NMAX 100005
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
struct muchie{
int x, y;
bool vizmuchie=false;
};
muchie muchii[MMAX];
int n, m, nrizolat=0, nr;
int x, y, d[NMAX];
int viz_conex[NMAX];
stack<int> ciclu;
vector<int> graph[NMAX];
int verif_grad(){
int ok=1;
for(int i=1; i<=n; i++){
if(d[i]%2 != 0 || (viz_conex[i]==0 && d[i]!=0))
return 0;
}
return 1;
}
void euler(){ // graph[nod]
ciclu.push(1);
while(!ciclu.empty()){
int x = ciclu.top(); // ultimul nod
if(!graph[x].empty()){
int ultim = graph[x].back(); // indicele ultimei muchii
graph[x].pop_back();
if(muchii[ultim].vizmuchie == false){
int nod = (x==muchii[ultim].x)?muchii[ultim].y:muchii[ultim].x;
ciclu.push(nod);
muchii[ultim].vizmuchie = true;
}
}
else {
if(ciclu.size()>1)
g<<x<<" ";
ciclu.pop();
}
}
}
void parcurgere(int i){
viz_conex[i] = 1;
for(auto &v:graph[i]){
int x = (i==muchii[v].x)?muchii[v].y:muchii[v].x;
if(viz_conex[x] == 0){
parcurgere(x);
}
}
}
int main()
{
// freopen("ciclueuler.in", "r", stdin);
// freopen("ciclueuler.out", "w", stdout);
// scanf("%d %d", &n, &m);
f>>n>>m;
for(int i=1; i<=m; i++){
f>>muchii[i].x>>muchii[i].y;
graph[muchii[i].x].push_back(i);
graph[muchii[i].y].push_back(i);
d[muchii[i].x]++;
d[muchii[i].y]++;
}
parcurgere(1);
if(verif_grad() == 1){
euler();
}
else g<<"-1";
return 0;
}