Cod sursa(job #1334463)

Utilizator Darius15Darius Pop Darius15 Data 4 februarie 2015 13:46:31
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector <int> v[100001];
int n,m,i,ms,x,y,j,ram,ni,nc,l,nu,sel,sol[100001];
queue <int> q;
bitset <100001> viz;
bool ok;
int main()
{
   f>>n>>m;
   for (i=1;i<=m;i++)
   {
       f>>x>>y;
       v[x].push_back(y);
       v[y].push_back(x);
   }
  ok=true;
  for (i=1;i<=n;i++)
    if ((v[i].size() & 1)==1) ok=false;
 q.push(1);
 while(!q.empty())
 {
      x=q.front();
      q.pop();
      for (j=0;j<v[x].size();j++)
        if (viz[v[x][j]]==false)
        viz[v[x][j]]=true,q.push(v[x][j]);
 }
 for (i=1;i<=n;i++)
    if (viz[i]==false) ok=false;
 if (ok==false)
    g<<-1;
 else
 {
     ms=0;
     ni=1;
     sol[1]=1,l=1;
     while(ms<m)
     {
          nc=ni;
          do
          {
              nu=v[nc].front();
              v[nc].erase(v[nc].begin()+0);
              for (j=0;j<v[nu].size();j++)
                if (v[nu][j]==nc) v[nu].erase(v[nu].begin()+j);
              nc=nu;
              ms++;
              if (v[nc].size()>1)
                sel=nc;
              if (nc!=ni) sol[++l]=nc;
              ram=nc;
          }while(nc!=ni);
          ni=sel;
     }
     for (i=1;i<=l;i++)
        g<<sol[i]<<' ';
        g<<ram<<' ';
 }
    return 0;
}