Cod sursa(job #723589)

Utilizator GrimpowRadu Andrei Grimpow Data 25 martie 2012 17:27:50
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
vector <int> a[100000];
int ver[100005],n,m,poz=0,S[500500];
int con[100005]={0};
int z[500500],y[500500],sol[500500],nr,x;
bool viz[500500];

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)
    {
        if(!viz[*it])
        {
            viz[*it]=true;
            euler(z[*it]+y[*it]-nod);
        }
    }
    //cout<<poz;
    S[poz]=nod;
    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;++i)
    {
        g<<S[i]<<' ';
    }
}


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



}


/*


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;
*/