Cod sursa(job #1461330)

Utilizator RobertSSamoilescu Robert RobertS Data 15 iulie 2015 14:15:13
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
#include <vector>
#include <stack>
using namespace std;

#define MAX 100005

/*fisiere de intrare respectiv iesire*/
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");


/*lista de adiacenta*/
vector<int> graf[MAX];
/*stiva de noduri din ciclue*/
stack<int> ciclu;


/*gradul fiecarui nod*/
int grad[MAX];
/*vector de noduri vizitate*/
bool vizitat[MAX];


/*functie de eliminare a unui element dintr-o lista de adiacenta*/
bool EraseElement(vector<int> &v, int elem)
{
    vector<int>::iterator it;
    for(it = v.begin(); it != v.end(); it++)
    {
        if(*it == elem)
            break;
    }

    if(it != v.end())
    {
        v.erase(it);
        return true;
    }

    return false;
}


int n, m; /*numarul de noduri, respectiv numarul de laturi*/

/*Functie de citrire*/
void Citire()
{

    fin >> n >> m;
    for(int i = 0; i < m; i++)
    {
        int nod1, nod2;
        fin >> nod1 >> nod2;
       // cout << nod1 << " " << nod2 << endl;
        graf[nod1].push_back(nod2);
        graf[nod2].push_back(nod1);
        grad[nod1]++; grad[nod2]++;
    }
}


void DFS(int nod)
{
    vizitat[nod] = true;
    for(vector<int>::iterator it = graf[nod].begin(); it != graf[nod].end(); it++)
    {
        if(!vizitat[*it])
            DFS(*it);

    }
}

void Euler()
{
    int nod, adiacent;
    ciclu.push(1);
    while(!ciclu.empty())
    {
        nod = ciclu.top();
        if (!graf[nod].empty())
        {
            adiacent = graf[nod].back();
            graf[nod].pop_back();
            EraseElement(graf[adiacent], nod);
            ciclu.push(adiacent);
        }
        else
        {
            fout << nod << " ";
            ciclu.pop();
        }
    }
}

bool Verificare()
{
    for(int i = 1; i <= n; i++)
    {
        if(!vizitat[i] || grad[i] % 2 != 0) return false;
    }

    return true;
}

int main()
{
    Citire();
    DFS(1);
    if(Verificare())
    {
        Euler();
        fout << '\n';
    }
    else
        fout << "-1\n";


    return 0;
}