Cod sursa(job #614703)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 7 octombrie 2011 15:14:41
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <stack>
#include <vector>
#include <queue>
using namespace std;

ifstream fi("ciclueuler.in");
ofstream fo("ciclueuler.out");
vector<int>::iterator st;
vector<int> v[100002];
queue<int>Q;
stack<int>S;
int n,m,deg[100002];
bool viz[100002],conex,par;
void sterge(int x,int y)
{
  int i;
  deg[x]--; deg[y]--;
  for(i=0;i<v[x].size();i++) if(v[x][i]==y) break;
  st=v[x].begin()+i;
  v[x].erase(st);
  for(i=0;i<v[y].size();i++) if(v[y][i]==x) break;
  st=v[y].begin()+i;
  v[y].erase(st);

}
void euler(int x)
{
  while(1)
  {
    if(v[x].size()==0) break;
    int y=v[x][0];
    S.push(x);
    sterge(x,y);
    x=y;
  }
}
void rezolva()
{
  int x;
  do
  {
    euler(x);
    x=S.top(); S.pop();
    Q.push(x);
  } while(!S.empty());
  while(!Q.empty())
  {
    fo<<Q.front()<<" ";
    Q.pop();
  }
}
int main()
{
  int i,x,y;
  fi>>n>>m;
  for(i=1;i<=m;i++)
  {
    fi>>x>>y;
    v[x].push_back(y);
    v[y].push_back(x);
    deg[x]++;
    deg[y]++;
  }
  viz[1]=0;
  Q.push(1);
  while(!Q.empty())
  {
    x=Q.front();
    Q.pop();
    for(i=0;i<v[x].size();i++)
    if(!viz[v[x][i]])
    {
      viz[v[x][i]]=1;
      Q.push(v[x][i]);
    }
  }
  conex=1;
  for(i=2;i<=n;i++) if(!viz[i]) { conex=0; break; }
  par=1;
  for(i=1;i<=n;i++) if(deg[i]%2) { par=0; break; }
  x=1;
  if(par&&conex) rezolva(); else fo<<"-1\n";
  return 0;

}