Cod sursa(job #412545)

Utilizator lorandCsorba Lorand-Alexandru lorand Data 5 martie 2010 19:59:18
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.62 kb
using namespace std;
#include<fstream>
#include<vector>
#include<stack>
#include<queue>
vector<int>G[100005];
stack<int>ciclu;
int n,m,d[100005],v[100005];
int main()
{
    vector<int>::iterator I;
    int i,x,y,solutie;
    ifstream fin("ciclueuler.in");
    fin>>n>>m;
    for(i=1;i<=m;++i)
    {
                     fin>>x>>y;
                     G[x].push_back(y);
                     G[y].push_back(x);
                     ++d[x];
                     ++d[y];
    }
    fin.close();
    for(i=1;i<=n;++i)
       if(d[i]%2)
       {
                 solutie=0;
                 break;
       }
    if(solutie)
    {
               v[1]=1;
               queue<int>q;
               q.push(1);
               while(q.empty()==false)
               {
                                      x=q.front();
                                      for(I=G[x].begin();I!=G[x].end();++I)
                                         if(v[*I]==0)
                                         {
                                                     v[*I]=1;
                                                     q.push(*I);
                                         }
                                      q.pop();
               }
               for(i=1;i<=n;++i)
                  if(v[i]==0)
                  {
                             solutie=0;
                             break;
                  }
    }
    ofstream fout("ciclueuler.out");
    if(solutie)
    {
               ciclu.push(1);
               while(ciclu.empty()==false)
               {
                                          x=ciclu.top();
                                          if(G[x].empty()==false)
                                          {
                                                                 y=G[x].back();
                                                                 G[x].pop_back();
                                                                 ciclu.push(y);
                                                                 for(I=G[y].begin();I!=G[y].end() && *I!=x;++I);
                                                                 G[y].erase(I);
                                          }
                                          else
                                          {
                                              ciclu.pop();
                                              if(ciclu.empty()==false)
                                                fout<<x<<' ';
                                          }
               }
    }
    else
      fout<<-1;
    fout.close();
    return 0;
}