Cod sursa(job #1348435)

Utilizator alex.vasiuVasiu Alexandru alex.vasiu Data 19 februarie 2015 18:18:18
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>

using namespace std;
int v[100001],n;
bool a[10000][10000];
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
bool viz[100001];
int grad[100001];
void citire()
{
    int m;
    f>>n>>m;
    int x,y;
    while(f>>x>>y)
    {
        if(x!=y)
        {
            a[x][y]=a[y][x]=1;
            viz[x]=viz[y]=1;
        }
    }
}
bool viz1[100];
void DF(int k)
{
    viz1[k]=1;
    for(int i=1; i<=n; i++)
        if(a[k][i]==true && viz1[i]==0)
            DF(i);
}
bool grade()
{
    for(int i=1; i<=n; i++)
    {
        int s=0;
        for(int j=1; j<=n; j++)
            s+=a[i][j];
        if(s%2==1)
            return 0;
    }
    return 1;
}
int vec(int nod)
{
    for(int i=1; i<=n; i++)
        if(a[i][nod]==1)
            return i;
    return -1;
}
void euler(int nod)
{
    g<<nod<<" ";
    while(vec(nod)!=-1)
    {
        int w=vec(nod);
        a[w][nod]=a[nod][w]=0;
        euler(w);
    }
}
int main()
{
    citire();
    int p=1;
    for(int i=1; i<=n; i++)
        if(viz[i]==0)
        {
            p=0;
            g<<"-1";
        }
    if(p==1)
    {
        int q=1;
        if(grade()==0)
        {
            q=0;
            g<<"-1";
        }
        if(q==1)
        {
            DF(1);
            for(int i=1; i<=n; i++)
                if(viz1[i]==0)
                {
                    q=0;
                    g<<"-1";
                    break;
                }
            if(q==1)
                euler(1);
        }
    }
    g.close();
}