Cod sursa(job #1290226)

Utilizator span7aRazvan span7a Data 10 decembrie 2014 23:06:54
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include<fstream>
#include<vector>
#define maxN 100001
#define maxM 500001
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector<int>v[maxN],sol;
int d[maxN],t[maxN],n,m;
bool viz[maxN];
void citire()
{
    int i,x,y;

    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
        d[x]++;d[y]++;
    }
}
void df(int nod)
{
    viz[nod]=true;
    for(int i=0;i<v[nod].size();i++)
    {
        if(viz[v[nod][i]]==false)
            {
                t[v[nod][i]]=nod;
                df(v[nod][i]);
            }
    }
}
bool verif()
{
    for(int i=1;i<=n;i++)
     {
          if(viz[i]==false) return false;
          if(d[i]%2==1)return false;
     }
     return true;
}
void sterge(int a,int b)
{
    for(int i=0;i<v[a].size();i++)
        if(v[a][i]==b)
    {
        v[a].erase(v[a].begin()+i);
        return;
    }
}
void euler(int nod)
{
    int i,nod_cur;
    for(i=0;i<v[nod].size();i++)
    {   if(v[nod][i]==0)continue;
        if(t[v[nod][i]]!=i&&t[i]!=v[nod][i])
        {
            nod_cur=v[nod][i];
            v[nod].erase(v[nod].begin()+i);
            sterge(nod_cur,nod);
            sol.push_back(nod_cur);
            euler(nod_cur);
        }
    }

    for(i=0;i<v[nod].size();i++)
    {
        if(v[nod][i]==0)continue;
        if(t[v[nod][i]]==nod||t[nod]==v[nod][i])
        {
            nod_cur=v[nod][i];
            v[nod].erase(v[nod].begin()+i);
            sterge(nod_cur,nod);
            sol.push_back(nod_cur);
            euler(nod_cur);
        }
    }
}
int main()
{
    bool ok;
    citire();
    df(1);
    ok=verif();
    if(ok==false)
        {
            g<<"-1 ";
        }
    else
        {
            sol.push_back(1);
            euler(1);
            for(int i=0;i<sol.size();i++)
                g<<sol[i]<<" ";

        }
    return 0;
}