Cod sursa(job #1281923)

Utilizator Arodoet96Teodora Stoleru Arodoet96 Data 3 decembrie 2014 20:37:02
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.48 kb
#include <fstream>
#define NMAX 1000

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct Nod
{
    int vf;
    struct Nod *urm;
};
typedef Nod *Lista;

int n, m;
int G[NMAX][NMAX];
int d[NMAX];
bool uz[NMAX];
int nr;
Lista C1, C2;

void citire();
bool conex();
void DFS(int);
bool grade_pare();
int det_ciclu(int, Lista&);
void inserare(int, Lista&);
int caut_varf_adiacent(int);
int det_varf();
void unific();
void afisare();

int main()
{
    int nr, nr2, z;
    citire();
    if(conex()&&grade_pare())
    {
        nr=det_ciclu(1, C1);
        while(nr<m)
        {
            z=det_varf();//C1 va indica nodul care il preceda pe z
            nr2=det_ciclu(z, C2);
            unific();
            nr+=nr2;
        }
        afisare();
        return 0;
    }
    fout<<-1<<'\n';
    return 0;
}

void citire()
{
    int i, x, y;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        d[x]++; d[y]++;
        G[x][y]++; G[y][x]++;//multigraf
    }
}

bool conex()
{
    int i;
    DFS(1);
    if(nr!=n)
        return 0;
    return 1;
}

void DFS(int vf)
{
    uz[vf]=1; nr++;
    int i;
    for(i=1;i<=n;i++)
        if(G[vf][i] && !uz[i])
            DFS(i);
}

bool grade_pare()
{
    int i;
    for(i=1;i<=n;i++)
        if(d[i]%2!=0)
            return 0;
    return 1;
}

int det_ciclu(int x, Lista& C)
{
    int y, nr=0;
    C=NULL;
    inserare(x, C);
    do
    {
        y=caut_varf_adiacent(C->vf);
        if(y!=x) inserare(y, C);
        nr++;
    }
    while(y!=x);
    return nr;
}

void inserare(int x, Lista& C)
{
    Lista p=new Nod;
    p->vf=x;
    if(!C)
    {
        p->urm=p;
        C=p;
        return;
    }
     p->urm=C->urm;
     C->urm=p;
     C=p;
}

int caut_varf_adiacent(int x)
{
    int i;
    for(i=1;i<=n;i++)
        if(G[i][x])
        {
            G[i][x]--; G[x][i]--;
            d[x]--; d[i]--;
            return i;
        }
    return 0;//nu ajunge niciodata aici
}

int det_varf()
{
    //parcurg ciclul C1 pana cand gasesc un varf z cu gradul nenul
    Lista p=C1;
    while(d[p->urm->vf]==0) p=p->urm;
    C1=p;
    return p->urm->vf;

}

void unific()
{
    Lista p;
    p=C1->urm;
    C1->urm=C2->urm;
    C2->urm=p;
}

void afisare()
{
    Lista p=C1;
    do
    {
        fout<<p->vf<<' ';
        p=p->urm;
    }
    while(p!=C1);
    fout<<C1->vf<<'\n';
}