Cod sursa(job #2164339)

Utilizator novistaAlex Staicu novista Data 12 martie 2018 22:59:31
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#define Nmax 1001
using namespace std;
ifstream fin ("eul.in");
ofstream fout ("eul.out");
int n,m,a[Nmax][Nmax],d[Nmax];
int c3[Nmax],nr;
void ciclu (int k,int c[1001],int &u) //u nr de elem ale ciclului , c e ciclul, k e primul nod
{
    int h,i;
    h=k;
    u=1;
    c[u]=h;
    do
    {
        for (i=1;i<=n;i++)
            if (a[i][h]==1)
                break;
        u++;
        c[u]=i;
        d[i]--;
        d[h]--;
        a[i][h]=0;
        a[h][i]=0;
        h=i;
    }while (h!=k);
}
void concatenare (int c[100],int &dc, int k, int c1[100],int u)
{
    int x[1001],dx,i;
    dx=0;
    for (i=1;i<=k;i++)
    {
        dx++;
        x[dx]=c[i];
    }
    for (i=2;i<=u;i++)
    {
        dx++;
        x[dx]=c1[i];
    }
    for (i=k+1;i<=dc;i++)
    {
        dx++;
        x[dx]=c[i];
    }
    for (i=1;i<=dx;i++)
        c[i]=x[i];
    dc=dx;
}
void construire (int c[1001],int &dc)
{
    int k,i,c1[1001],u;
    ciclu(1,c,dc);
    do
    {
        k=0;
        for (i=1;i<=dc;i++)
            if (d[c[i]]>0)
            {
                k=i;
                break;
            }
        if (k>0)
        {
            ciclu(c[k],c1,u);
            concatenare(c,dc,k,c1,u);
        }
    }while (k>0);
}
int main()
{
    int i,j,h;
    fin>>n>>m;
    for (h=1;h<=m;h++)
    {
        fin>>i>>j;
        a[i][j]=1;
        a[j][i]=1;
        d[i]++;
        d[j]++;
    }
    construire(c3,nr);
    for (i=1;i<=nr;i++)
        cout<<c3[i]<<" ";
    fin.close();
    fout.close();
    return 0;
}