Cod sursa(job #723259)

Utilizator GrimpowRadu Andrei Grimpow Data 25 martie 2012 11:04:25
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
vector <int> a[100000];
int ver[100000],n,m,x,y,poz=0,S[100000];
int con[100000]={0};

void bfs(int nod)
{
    for(vector<int>::iterator i=a[nod].begin();i!=a[nod].end();++i)
    {
        if(con[*i]==0)
        {
            con[*i]=1;
            bfs(*i);
        }
    }
}

void conex()
{
    bfs(1);
    for(int i=2;i<=n;++i)
    {
    if(con[i]==0)
      x=1;
    }
}


int euler(int nod)
{
    //cout<<nod;
    for(vector<int>::iterator it=a[nod].begin();it!=a[nod].end();++it)
    {
        int p;
        if(!a[nod].empty())
        p=*it;
        else p=0;
        if(!a[nod].empty())
        a[nod].erase(it);
        for(vector<int>::iterator i=a[p].begin();i!=a[p].end();++i)
            if(*i==nod&& !a[p].empty())
                {a[p].erase(i);break;}

        int t=0;
        t=1;
        cout<<p;
        if(p!=0)
        euler(p);
        if(a[nod].empty())
        break;
        //cout<<3;
    }
    cout<<poz;
    S[poz]=nod;
    poz++;
    //cout<<poz;
    return 0;

}
int paritate()
{
    for(int i=1;i<=n;++i)
    if(ver[i]%2==1)
    {
        x=1;
        return 0;
    }
}

int solve()
{
    conex();
   // cout<<x;
    paritate();
    if( x==1 )
    {
        ofstream g("ciclueuler.out");
        g<<-1;
        return 0;
    }
    euler(1);
    cout<<12345;
}


void write()
{
    ofstream g("ciclueuler.out");
    for(int i=0;i<poz-1;++i)
    {
        g<<S[i]<<' ';
    }
}


int main()
{
    ifstream f("ciclueuler.in");
    f>>n>>m;
    for(int i=0;i<m;++i)
    {
        f>>x>>y;
        a[x].push_back(y);
        if(x!=y)a[y].push_back(x);
       // cout<<x<<y<<' ';
        ver[x]++;
        ver[y]++;
    }
    f.close();
    solve();
    if(x==1)
    return 0;
    write();



}