Cod sursa(job #1331756)

Utilizator andreiulianAndrei andreiulian Data 1 februarie 2015 10:22:30
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
#include<vector>
#define pb push_back
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
int N,M,s[500005],u,vv[100005],a;
vector<int> v[100005];
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 eulers(int i)
{
    int k,j,c,nc;
    s[++u]=i;
    while(u)
    {
        nc=s[u];
        while(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;
        }
    }
}