Cod sursa(job #1331655)

Utilizator andreiulianAndrei andreiulian Data 31 ianuarie 2015 22:21:25
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>
#include<vector>
#define pb push_back
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
int N,M,s[100005],u,vv[100005],a;
vector<int> v[100005];
//void euler(int i);
void eulers(int i);
int main()
{
    in>>N>>M;
    int i,a,b;
    for(i=1;i<=N;++i) v[i].pb(0);
    for(i=1;i<=M;++i)
    {
        in>>a>>b;
        v[a].pb(b);
        v[b].pb(a);
        v[a][0]++;
        v[b][0]++;
        vv[a]++;
        vv[b]++;
    }
    for(i=1;i<=N;++i) if(vv[i]%2) {out<<"-1\n"; return 0;}
    eulers(1);
}
void euler(int i)
{
    int k,j,c;
    if(vv[i])
    {
        for(k=1;k<=v[i][0];++k)
        {
            if(v[i][k])
            {
                c=v[i][k];
                v[i][k]=0;
                --vv[i];
                for(j=1;j<=v[c][0];++j)
                {

                    if(v[c][j]==i) {v[c][j]=0, vv[c]--; break;}
                }
                euler(c);
            }
        }
    }
    if(!vv[i] && a<M) out<<i<<' ',++a;
}

void eulers(int i)
{
    int k,j,c,nc;
    s[++u]=i;
    while(u)
    {
        nc=s[u];
        if(vv[nc])
        {
            for(k=1;k<=v[nc][0];++k)
            {
                if(v[nc][k])
                {
                    c=v[nc][k];
                    v[nc][k]=0;
                    --vv[nc];
                    for(j=1;j<=v[c][0];++j)
                    {
                        if(v[c][j]==nc) {v[c][j]=0, vv[c]--; break;}
                    }
                    s[++u]=c; break;
                }
            }
        }
        if(!vv[s[u]])
        {
            if(a<M) out<<s[u]<<' ';
            ++a;
            --u;
        }
    }
}