Cod sursa(job #1342043)

Utilizator Pintilie_AndreiFII-Pintilie Andrei Pintilie_Andrei Data 13 februarie 2015 14:28:47
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
#define N 100004
using namespace std;
vector <int>a[N];
stack <int> st;
queue <int> q;
int n,m;
int v[N],g[N];
void Read()
{
    ifstream fin("ciclueuler.in");
    fin>>n>>m;
    int i,x,y;
    for(i=1; i<=m; i++)
    {
        fin>>x>>y;
        a[x].push_back(y);
        a[y].push_back(x);
        g[x]++;
        g[y]++;
    }
    fin.close();
}
void DFS(int k)
{
    v[k]=1;
    for(int i=0; i<a[k].size(); i++)
        if(!v[a[k][i]])
        DFS(a[k][i]);
}
bool IsConex()
{
    DFS(1);
    int i;
    for(i=1; i<=n; i++)
        if(!v[i]) return 0;
    return 1;
}
bool Grad()
{
    for(int i=1; i<=n; i++)
        if(g[i]%2) return 0;
    return 1;
}
void Euler()
{
    st.push(1);
    int i,j,k;
    while(!st.empty())
    {
        k=st.top();
        while(a[k].size()>0)
        {
             i=a[k][0];
            swap(a[k][0],a[k][a[k].size()-1]);
            a[k].pop_back();

            for(j=0; j<a[i].size() && a[i][j]!=k; j++) ;

                swap(a[i][j],a[i][a[i].size()-1]);
                a[i].pop_back();

            st.push(i);
            k=st.top();
        }
        if(a[k].size()<=0)
            st.pop();

            q.push(k);
    }
}
int main()
{
   ofstream fout("ciclueuler.out");
   Read();
   int x;
   if( IsConex() && Grad()  )
   {
       Euler();
       while(!q.empty())
       {
           x=q.front();
           fout<<x<<" ";
           q.pop();
       }
       fout<<"\n";
   }
   else fout<<"-1\n";
   fout.close();
    return 0;
}