Pagini recente » Cod sursa (job #2048220) | Cod sursa (job #2032603) | Cod sursa (job #657389) | Cod sursa (job #767202) | Cod sursa (job #1638228)
#include <fstream>
#include <vector>
using namespace std;
bool e_eulerian(const vector<vector<int> >& graf){
for(int i = 0; i < graf.size(); ++i){
if(graf[i].size()%2 != 0){
return false; } }
return true; }
void mk_euler(vector<vector<int> >& graf, const vector<int>& muchii, vector<int>& rez){
const int n = graf.size(), m = muchii.size();
vector<bool> use(m, false);
vector<int> drum(1, 0);
while(!drum.empty()){
const int cur = drum.back();
while(!graf[cur].empty() && use[graf[cur].back()]){
graf[cur].pop_back(); }
if(graf[cur].empty()){
rez.push_back(cur);
drum.pop_back(); }
else{
use[graf[cur].back()] = true;
drum.push_back(muchii[graf[cur].back()] ^ cur); } } }
int main(){
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n, m;
f >> n >> m;
vector<vector<int> > graf(n);
vector<int> muchii(m);
for(int i = 0, a, b; i < m; ++i){
f >> a >> b;
--a, --b;
muchii[i] = (a ^ b);
graf[a].push_back(i);
graf[b].push_back(i); }
if(!e_eulerian(graf)){
g << -1;
return 0; }
vector<int> rez;
mk_euler(graf, muchii, rez);
for(int i = 0; i < rez.size()-1; ++i){
g << rez[i]+1 << ' '; }
return 0; }