Cod sursa(job #1131817)

Utilizator costyv87Vlad Costin costyv87 Data 1 martie 2014 16:51:06
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#include <cstdio>
#include <vector>
using namespace std;
FILE *f,*g;
vector <int> a[100100];
vector <bool> e[100100];
int gr[100100];
int n,m,i,j,x,y;
bool ok;
bool bf[100100];
vector <int> q;

int main()
{
    f=fopen("ciclueuler.in","r");
    g=fopen("ciclueuler.out","w");

    fscanf(f,"%d%d",&n,&m);

    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&x,&y);
        a[x].push_back(y);
        if (x!=y) a[y].push_back(x);

        gr[x]++;
        gr[y]++;
        e[x].push_back(true);
        if (x!=y) e[y].push_back(true);
    }
    ok=true;
    for (i=1;i<=n;i++)
        if (gr[i]%2==1)
        {
            ok=false;
            return 0;
        }
    q.push_back(1);
    bf[1]=true;

    for (i=0;i<q.size();i++)
    {
        x=q[0];

        for (j=0;j<a[x].size();j++)
            if (bf[a[x][j]]==false)
            {
                bf[a[x][j]]=true;
                q.push_back(a[x][j]);
            }
    }
    for (i=1;i<=n;i++)
        if (bf[i]==false)
        {
            ok=false;
            break;
        }

    if (ok==false)
    {
        fprintf(g,"-1");
        return 0;
    }
    ok=true;
    x=1;
    while (1==1)
    {
        if (gr[x]==0) return 0;
        fprintf(g,"%d ",x);



        ok=false;
        gr[x]--;

        for (i=0;i<a[x].size();i++)
            if (gr[a[x][i]]%2==0 && e[x][i]==true)
            {
                y=a[x][i];

                e[x][i]=false;
                if (x!=y) for (j=0;j<a[y].size();j++)
                    if (a[y][j]==x && e[y][j]==true)
                    {
                        e[y][j]=false;
                        break;
                    }
                gr[y]--;

                ok=true;
                x=y;
                break;
            }
        if (ok==false)
        {
            for (i=0;i<a[x].size();i++)
            if (gr[a[x][i]]%2==1 && e[x][i]==true)
            {
                y=a[x][i];

                e[x][i]=false;
                 if (x!=y)
                 for (j=0;j<a[y].size();j++)
                    if (a[y][j]==x && e[y][j]==true)
                    {
                        e[y][j]=false;
                        break;
                    }
                gr[y]--;

                x=y;
                ok=true;
                break;
            }

        }

    }


    return 0;
}