Cod sursa(job #1821673)

Utilizator Robert_VRVRobert Vadastreanu Robert_VRV Data 3 decembrie 2016 14:21:57
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>

using namespace std;
ifstream fin("graf.in");
ofstream fout("graf.out");
int n,m,a[10000][10000],d[10000],c[10000],dc;
void ciclu(int k,int c[10000],int &u)
{
    int i,h;
    h=k;
    u=1;
    c[u]=h;
    do
    {
        for(i=1;i<=n;i++)
            if(a[h][i]==1)
                break;
        u++;
        c[u]=i;
        a[h][i]=0;
        a[i][h]=0;
        d[h]--;
        d[i]--;
        h=i;
    }while(h!=k);
}
void concatenare(int c[10000],int &dc,int k,int c1[10000],int u)
{
    int x[10000],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[10000],int &dc)
{
    int k,i,c1[10000],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()
{
    fin>>n>>m;
    int i,x1,x2;
    for(i=1;i<=m;i++)
    {
        fin>>x1>>x2;
        a[x1][x2]=1;
        a[x2][x1]=1;
        d[x1]++;d[x2]++;
    }
    fin.close();
    construire(c,dc);
    for(i=1;i<=dc;i++)
        fout<<c[i]<<" ";
    return 0;
}