Cod sursa(job #2145772)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 27 februarie 2018 16:45:20
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define DIM 100002

using namespace std;

ifstream in ("ciclueuler.in");
ofstream out("ciclueuler.out");

int n, m, x, y;

bool viz[DIM];

vector<int> sol;

struct GRAF{
    int edg;
    bool viz;
};

GRAF make_graf(int edg, int viz){
    GRAF x;
    x.edg = edg;
    x.viz = viz;
    return x;
}

vector<GRAF> graf[DIM];

bool check(int nod, int nodc){
    int st = 0;
    int dr = graf[nod].size() - 1;
    while(st <= dr){
        int mid = (st + dr) / 2;
        if(graf[nod][mid].edg < nodc)
            st = mid + 1;
        if(graf[nod][mid].edg == nodc && graf[nod][mid].viz == 1)
            st = mid + 1;
        if(graf[nod][mid].edg > nodc)
            dr = mid - 1;
        if(graf[nod][mid].edg == nodc && graf[nod][mid].viz == 0)
            dr = mid - 1;
    }
    if(graf[nod][st].edg == nodc && graf[nod][st].viz == 0){
        graf[nod][st].viz = 1;
        return 1;
    }
    return 0;
}

void euler(int nod){
    viz[nod] = 1;
   // sol.push_back(nod);
    for(int i = 0; i < graf[nod].size(); ++ i){
        if(graf[nod][i].viz)
            continue;
        int nodc = graf[nod][i].edg;
        graf[nod][i].viz = 1;
        if(check(nodc, nod)){
            euler(nodc);
        }
    }
    sol.push_back(nod);
}

bool cmp(GRAF a, GRAF b){
    return a.edg < b.edg;
}

int main(int argc, const char * argv[]) {
    in>>n>>m;
    for(int i = 1; i <= m; ++ i){
        in>>x>>y;
        graf[x].push_back(make_graf(y, 0));
        graf[y].push_back(make_graf(x, 0));
    }
    for(int i = 1; i <= n; ++ i){
        sort(graf[i].begin(), graf[i].end(), cmp);
        if(graf[i].size() % 2){
            out<<-1;
            return 0;
        }
    }
    euler(1);
    for(int i = 1; i <= n; ++ i)
        if(!viz[i]){
            out<<-1;
            return 0;
        }
    for(vector<int>::iterator it = sol.begin(); it != sol.end() - 1; ++ it)
        out<<*it<<" ";
    return 0;
}