Cod sursa(job #363535)

Utilizator PopaStefanPopa Stefan PopaStefan Data 13 noiembrie 2009 17:53:13
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
/*Problema ciclu eulerian de pe infoarena
arhiva educationala 10 puncte
*/
#include<fstream>
#define nmax 7010
#define mmax 500010

using namespace std;

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

int a[nmax][nmax],ciclu[mmax],gr[nmax],k,n,m,c1[mmax];

void citire()
{int i,x,y;
fin>>n>>m;
for(i=1;i<=m;i++)
   {fin>>x>>y;
    gr[x]++;
    gr[y]++;
    a[x][y]=1;
    a[y][x]=1;
   }
}

void det_ciclu_eulerian()
{int i,k1,poz,ok=0;
k=1;
ciclu[1]=1;
do
   {ok=0;
    for(i=1;i<=n;i++)
      if(a[ciclu[k]][i]==1)
        {ciclu[k+1]=i;
        gr[ciclu[k]]--;
        ok=1;
        gr[ciclu[k+1]]--;
        a[ciclu[k+1]][ciclu[k]]=0;
        a[ciclu[k]][ciclu[k+1]]=0;
        k++;
        break;
        }
        if(ok==0) {fout<<"-1";
                    exit(0);
                  }
   }while(ciclu[k]!=ciclu[1]);
while(k<=m)
  {for(i=1;i<=k;i++)
     if(gr[ciclu[i]]!=0)
       break;
   k1=1;
   c1[k1]=ciclu[i];
   poz=i;
   do
     {ok=0;
      for(i=1;i<=n;i++)
        if(a[c1[k1]][i]==1)
          {c1[k1+1]=i;
           gr[c1[k1]]--;
           ok=1;
           gr[c1[k1+1]]--;
           a[c1[k1+1]][c1[k1]]=0;
           a[c1[k1]][c1[k1+1]]=0;
           k1++;
           break;
          }
     if(ok==0) {fout<<"-1";
                exit(0);
               }
     }while(c1[k1]!=c1[1]);
  //concatenez
  for(i=k;i>poz;i--)
    ciclu[i+k1-1]=ciclu[i];
  for(i=2;i<=k1;i++)
    ciclu[poz+i-1]=c1[i];
    k=k+k1-1;
  }
}

void afisare()
{int i;
for(i=1;i<=m+1;i++)
  fout<<ciclu[i]<<" ";
}

int main()
{citire();
det_ciclu_eulerian();
afisare();
fin.close();
fout.close();
return 0;
}