Cod sursa(job #976789)

Utilizator manutrutaEmanuel Truta manutruta Data 23 iulie 2013 23:05:25
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;

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

vector < pair< int, int > > G[100100];
bitset <100100> viznod;
bitset <500100> vizmuchie;
vector <int> stiva;
vector <int> stiva2;
vector <int> :: iterator it;
int grad[100100];

int n, m, s, ok;

void euler(int x) {
    if (x == stiva[0]) {
        ok++;
        if (ok == 2) {
            return;
        }
    }

    for (int i = 0; i < G[x].size(); i++) {
        if (vizmuchie[G[x][i].second] == 0) {
            vizmuchie[G[x][i].second] = 1;
            stiva.push_back(G[x][i].first);
            euler(G[x][i].first);
            return;
        }
    }
}

void euler2(int x) {
    if (x == stiva2[0]) {
        ok++;
        if (ok == 2) {
            return;
        }
    }

    for (int i = 0; i < G[x].size(); i++) {
        if (vizmuchie[G[x][i].second] == 0) {
            vizmuchie[G[x][i].second] = 1;
            stiva2.push_back(G[x][i].first);
            euler2(G[x][i].first);
            return;
        }
    }
}

int main()
{
    int x, y;
    f >> n >> m;
    for (int i = 1; i <= m; i++) {
        f >> x >> y;

        G[x].push_back(make_pair(y, i));
        G[y].push_back(make_pair(x, i));

        grad[x]++;
        grad[y]++;
    }

    for (int i = 1; i <= n; i++) {
        if (grad[i] % 2 != 0) {
            g << "-1";
            exit(0);
        }
    }
    s = x;
    stiva.push_back(s);
    euler(s);

    it = stiva.begin();
    int okk = 1;
    while (okk) {
        okk = 0;
        for (int i = 0; i < stiva.size() && okk == 0; i++) {
            for (int j = 0; j < G[i].size() && okk == 0; j++) {
                if (vizmuchie[G[i][j].second] == 0) {
                    vizmuchie[G[i][j].second] = 1;
                    stiva2.push_back(G[i][j].first);
                    euler2(G[i][j].first);
                    ok = 1;
                    okk = 1;
                }
            }
        }

        /*for (int i = 0; i < stiva2.size(); i++) {
            cout << stiva2[i] << ' ';
        }
        cout << endl;*/

        int k = 0;
        for (int i = 0; i < stiva.size(); i++) {
            if(stiva[i] == stiva2[stiva2.size() - 1]) {
                stiva.insert(it + i + 1, stiva2.begin(),stiva2.end());
                while(stiva2.size()) {
                    stiva2.pop_back();
                }
                break;
            }
        }
    }

    for (int i = 0; i < stiva.size(); i++) {
        g << stiva[i] << ' ';
    }
    //cout << endl;

    return 0;
}