Cod sursa(job #2127182)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 10 februarie 2018 13:47:31
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<bits/stdc++.h>
using namespace std;

const int N=100005;
const int M=500005;

vector < pair<int, int> > G[N];
bool viz[M];

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

int n,m;

inline void read()
{
    int i,x,y;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        G[x].push_back(make_pair(y,i));
        G[y].push_back(make_pair(x,i));
    }
    for(i=1;i<=n;i++)
        if( G[i].size() &1  || !G[i].size()  )
    {
        fout<<"-1\n";
    }
}

stack <int> S;
vector<int> ans;

void solve()
{
    int nod,x,y;
    S.push(1);
    while(!S.empty())
    {
        nod=S.top();
        //cout<<nod<<' ';
        if(G[nod].empty())
        {
            S.pop();
            ans.push_back(nod);
           // cout<<"adaug la euler pe "<<nod<<endl;

        }
        else
        {
            x=G[nod].back().first;
            y=G[nod].back().second;
           // cout<<x<<' '<<y<<' ';
            G[nod].pop_back();
            if(!viz[y])
            {
                viz[y]=1;
                S.push(x); //exploatam vecinii lui x data viitoare
              //  cout<<"adaug pe "<<x<<'\n';

            }
           // cout<<endl;

        }

    }

}


void afisare()
{
    for(int i=0;i<ans.size();i++)
        fout<<ans[i]<<' ';
}



int main()
{
    read();
    solve();
    afisare();
}