Pagini recente » Cod sursa (job #2592991) | Cod sursa (job #874746) | Cod sursa (job #874747) | Cod sursa (job #2592872) | Cod sursa (job #3325977)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
vector<int> sol;
void dfs(int nod, vector<bool> &visN, vector<vector<pair<int, int>>> &graf){
visN[nod] = true;
for(auto nd : graf[nod]){
if(!visN[nd.first]){ ///first este nodul in care merge muchia
dfs(nd.first, visN, graf);
}
}
}
void euler(int node, vector<bool> &visM, vector<vector<pair<int, int>>> &graf){
while(graf[node].size() > 0){
int next_node = graf[node].back().first; //nodul urmator
int next_edge = graf[node].back().second; // muchia nodului urmator
graf[node].pop_back(); // scapam de acel nod pentru a nu mai folosi muchia iar
if(!visM[next_edge]){
visM[next_edge] = true;
euler(next_node, visM, graf);
}
}
sol.push_back(node + 1);
}
int main(){
int n, m;
in >> n >> m;
vector<int> grad(n);
vector<vector<pair<int, int>>> graf(n); /// nodurile se salveaza ca (nod1 -> {nod2, i}), i fiind indicele muchiei citie, deoarece acestea nu sunt neaparat distincte
for(int i = 0; i < m; i++){
int x, y;
in >> x >> y;
grad[x-1]++;
grad[y-1]++;
graf[x-1].push_back({y-1, i});
graf[y-1].push_back({x-1, i});
}
vector<bool> visN(n), visM(m);
dfs(0, visN, graf);
int ok = true;
for(int i = 0; i < n; i++){
if(!visN[i] || grad[i] % 2 == 1)
ok = false;
}
if(!ok){
out << -1;
return 0;
}
euler(0, visM, graf);
sol.pop_back(); //pentru a nu avea nodul de start de doua ori
for(auto i : sol)
out << i << " ";
}