Cod sursa(job #2367972)

Utilizator natrovanCeval Marius natrovan Data 5 martie 2019 13:05:38
Problema Ciclu Eulerian Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <stack>


using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

vector<int>graf[100500];
stack<int>myStack;
vector<int>ciclu;

int N, M, i, x, y, grad[100500];

void scoate(int x, int v)
{
    vector<int>::iterator it;
    for(it = graf[x].begin(); it != graf[x].end(); it++)
        if(*it == v)
        {
            graf[x].erase(it);
            --grad[x];
            break;
        }

    for(it = graf[v].begin(); it != graf[v].end(); it++)
        if(*it == x)
        {
            graf[v].erase(it);
            --grad[v];
            break;
        }
}

void Euler(int start)
{
    myStack.push(start);
    while(!myStack.empty())
    {
        int k = myStack.top();
        if(grad[k])
        {
            myStack.push(graf[k][0]);
            scoate(k, graf[k][0]);
        }
            else{
                ciclu.push_back(k);
                myStack.pop();
            }
    }
    ciclu.pop_back();

}

int main()
{
    fin>>N>>M;
    for(i = 1; i <= M; i++)
    {
        fin>>x>>y;
        if( x != y)
        {
            graf[x].push_back(y);
            graf[y].push_back(x);
            ++grad[x];
            ++grad[y];
        }
        else
            {
                graf[x].push_back(y);
                ++grad[y];
            }
    }

    Euler(1);

    for(vector<int>::iterator it = ciclu.begin(); it != ciclu.end(); it++)
            fout<<*it<<' ';

    return 0;

}