Cod sursa(job #1322421)

Utilizator andreip1996Paun Andrei andreip1996 Data 20 ianuarie 2015 00:35:15
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>


using namespace std;

vector <int> L[100001];
int viz[100001];
int n,m;
vector<int> ciclu;
stack<int> S;

void citire()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        L[x].push_back(y);
        L[y].push_back(x);
    }
}

int grade_pare()
{
    for(int i=1;i<=n;i++)
       if(L[i].size()%2==1)
           return 0;
    return 1;

}

void DFS(int i)
{
    //printf("%d ",i);
    viz[i]=1;
    for(vector <int>::iterator it=L[i].begin();it!=L[i].end();it++)
       if(!viz[*it])
          DFS(*it);

}

int conex()
{
    DFS(1);
    for(int i=1;i<=n ;i++)
       if(!viz[i]) return 0;
    return 1;

}


/*euler (nod v)
    cat timp (v are vecini)
        w = un vecin aleator al lui v
        sterge_muchie (v, w)
        euler (w)
    sfarsit cat timp
    adauga v la ciclu
*/

void det_ciclu()
{
    S.push(1);
    while(!S.empty())
    {
        int v=S.top();
        if(L[v].size())
           {
               int k=L[v].back();
               L[v].pop_back();
               S.push(k);
               vector<int> ::iterator it;
               it=find(L[k].begin(),L[k].end(),v);
               L[k].erase(it);

           }
           else
          {
              S.pop();
              ciclu.push_back(v);
          }
    }


}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    citire();
    if(!grade_pare() ||! conex())printf("-1");
    else
       //printf("da");
      {
          det_ciclu();
          for(vector<int>::iterator it=ciclu.begin();it!=ciclu.end()-1;it++)
              printf("%d ", *it);
      }
    return 0;
}