Cod sursa(job #1326350)

Utilizator alex.vasiuVasiu Alexandru alex.vasiu Data 25 ianuarie 2015 11:27:27
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>

using namespace std;
int v[100],n;
bool a[100][100];
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
bool viz[100];
int grad[100];
void citire()
{
    int m;
    f>>n>>m;
    int x,y;
    while(f>>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 valid_e(int m,int k)
{
    if(v[k-1]==m && k>0)
        return 0;
        if(k>0 && a[v[k-1]][m]==0)
        return 0;
   for(int j=0; j<k-1; j++)
        if(k>0 && (v[k-1]==v[j] && v[j+1]==m)||(v[k-1]==v[j+1] && v[j]==m))
            return 0;

    return 1;
}
void grade()
{
    for(int i=1;i<=n;i++)
    {
        int s=0;
        for(int j=1;j<=n;j++)
            s+=a[i][j];
        grad[i]=s;
    }
}
bool corect(int k)
{
    if(v[0]!=v[k])
        return 0;
    for(int i=0;i<k;i++)
    {
        grad[v[i]]--;
        grad[v[i+1]]--;
    }
    for(int i=1;i<=n;i++)
        if(grad[i]!=0)
        return 0;
    return 1;

}
void generare_euleriene(int k)
{
    for(int i=1;i<=n;i++)
        if(valid_e(i,k))
    {
        v[k]=i;
        grade();
        if(corect(k))
        {
            for(int i=0;i<=k;i++)
                g<<v[i]<<" ";
         break;
        }
        else
            generare_euleriene(k+1);
    }
}
int main()
{
    citire();
   int p=1;
    for(int i=1; i<=n; i++)
        if(viz[i]==0)
        {
            p=0;
            g<<"-1";
        }
    if(p==1)
        {
            grade();
           int q=1;
           grade();
           for(int i=1;i<=n;i++)
            if(grad[i]%2==1)
            {
                q=0;
                g<<"-1";
                break;
            }
            if(q==1)
            {
                DF(1);
                for(int i=1;i<=n;i++)
                    if(viz1[i]==0)
                {
                    q=0;
                    g<<"-1";
                    break;
                }
                if(q==1)
                    generare_euleriene(0);
            }
        }
}