Cod sursa(job #735596)

Utilizator visanrVisan Radu visanr Data 16 aprilie 2012 20:49:00
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <fstream>
using namespace std;

#define nmax 100010
#define pb push_back

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
vector<long> graph[nmax];
vector<long> degree(nmax);
vector<long> solution;
long n,m,x,y;

void read_input()
{
     in>>n>>m;
     for(long i=0;i<m;i++)
     {
              in>>x>>y;
              graph[x].pb(y);
              graph[y].pb(x);
              degree[x]++;
              degree[y]++;
     }
}

int Eulerian()
{
     //verificare daca exista nod cu grad impar
     for(long i=1;i<=n;i++) if(degree[i]%2) return 0;
     //verificam daca e conex
    /* queue<long> q;
     q.push(1);
     vector<bool> visited(nmax);
     visited[1]=true;
     while(!q.empty())
     {
                      long node=q.front();
                      q.pop();
                      for(long i=0;i<graph[node].size();i++)
                      {
                               if(visited[graph[node][i]]==false)
                               {
                                           q.push(graph[node][i]);
                                           visited[graph[node][i]]=true;
                               }
                      }
     }
     for(long i=1;i<=n;i++) if(visited[i]==false) return 0;*/
     return 1;
}

void euler(long start)
{
     stack <long> s;
     s.push(start);
     while(!s.empty())
     {
                      long node=s.top();
                    //  printf("plec din nodul %ld\n", node);
                      while(!graph[node].empty())
                      {
                                                 long nextNode= *graph[node].begin();
                                //                 printf("nextNode=%ld\n", nextNode);
                                                 graph[nextNode].erase(find(graph[nextNode].begin(),graph[nextNode].end(),node));
                                                 graph[node].erase(graph[node].begin());
                                                 s.push(nextNode);
                                                 node=nextNode;
                      }
                    //  printf("nodul final = %ld\n", s.top());
                      solution.pb(s.top());
                      s.pop();
     }
     solution.pop_back();
     for(int i=0;i<solution.size();i++) out<<solution[i]<<' ';
}

int main()
{
    int i;
    read_input();
    if(Eulerian()) euler(1);
    else out<<-1<<'\n';
    return 0;
}