Cod sursa(job #1485671)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 12 septembrie 2015 17:38:16
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.07 kb
#include <iostream>
#include <fstream>
#include <queue>
#define fin "ciclueuler.in"
#define fou "ciclueuler.out"
using namespace std;
ifstream t1(fin);
ofstream t2(fou);
int n,rel,x[30][30],grade[30],okpar,pus[30],viz[100],gradtot,stiva[100],rez[100],marime;

int iseulerian()
{
    queue <int> c;
    int nrvf=0,vf,i;
    c.push(1); nrvf=1; pus[1]=1;
    while(!c.empty())
    {
        vf=c.front(); c.pop();
        for(i=1;i<=n;i++)
            if(x[i][vf]==1 && pus[i]==0)
            {
                pus[i]=1;
                c.push(i);
                nrvf++;
            }
    }
    if(okpar==1 && nrvf==n) return 1;
                       else return 0;
}

int ciclu(int pornire)
{
    int i,j,nrstiva=1,vfcrt,poz=1,vf=0,vfprec=0;
    for(i=1;i<=n;i++) viz[i]=0;
    viz[pornire]=1;
    stiva[1]=pornire;
    vfprec=pornire;
    while(vf!=pornire)
    {
        vfcrt=stiva[poz]; grade[vfcrt]--; vf=0; gradtot--;
        for(i=1;i<=n;i++)
            if(x[i][vfcrt]==1 && grade[i]>0 && i!=vfprec) { vf=i; break; }
        if(vf!=0) {viz[vf]=1; stiva[++poz]=vf; grade[vf]--; gradtot--; }
             else  break;
        vfprec=vfcrt;
    }
    return poz;
}

int main()
{
    int i,j,lin,col,vfbun,nr,pozinser=0;
    t1>>n>>rel;
    for(i=1;i<=rel;i++)
    {
        t1>>lin>>col;
        x[lin][col]=1; x[col][lin]=1;
    }
    int grad;
    okpar=1;
    for(i=1;i<=n;i++)
    {
        grad=0;
        for(j=1;j<=n;j++) if(x[i][j]==1) grad++;
        grade[i]=grad;
        gradtot+=grad;
        if(grad%2==1) okpar=0;
    }
    cout<<okpar;
    if(iseulerian()==0) t2<<-1<<'\n';
                    else
                    {
                        while(gradtot!=0)
                        {
                            for(i=1;i<=n;i++) if(grade[i]>0) { vfbun=i; break; }
                            nr=ciclu(vfbun);
                            pozinser=0;
                            for(i=1;i<=marime;i++) if(vfbun==rez[i]) pozinser=i;
                            if(pozinser==0)
                            {
                                marime+=nr;
                                for(i=1;i<=marime;i++) rez[i]=stiva[i];
                            }else
                            if(pozinser==marime)
                            {
                                for(i=2;i<=nr;i++) rez[marime+i-1]=stiva[i];
                                marime+=nr; marime--;
                            }
                            else
                            {
                                int elemplus=marime-pozinser;
                                for(i=1;i<=elemplus;i++)
                                {
                                    rez[pozinser+i+nr-1]=rez[pozinser+i];
                                    rez[pozinser+i]=stiva[i+1];
                                }
                                marime+=nr; marime--;
                            }
                        }
                    }
    for(i=1;i<=marime;i++) t2<<rez[i]<<' '; t2<<'\n';
    t1.close();
    t2.close();
    return 0;
}