Pagini recente » Cod sursa (job #2762707) | Cod sursa (job #212999) | Cod sursa (job #2514160) | Cod sursa (job #1976017) | Cod sursa (job #2195905)
#include <fstream>
#define nmax 100002
#define mmax 500002
using namespace std;
struct graf_neorientat{
int n,m,Start[nmax+2],grad[nmax+2];
///pentru eliminarea muchiilor parcurse
bool vizm[mmax+2];
///pentru pastrarea vecinilor si a etichetei muchiei de care apartin
struct vecin{int x,pozm,urm;}T[2*mmax+2];
///pentru pastrarea nodurilor ciclului
struct nod{int x,urm;}E[mmax+2];
void citire(){
ifstream fin("ciclueuler.in");
int i,j,k,r;
fin>>n>>m;
for(k=1;k<=n;k++){
Start[k]=0;grad[k]=0;
}
r=0;
for(k=1;k<=m;k++){
fin>>i>>j;
vizm[k]=false; grad[i]++; grad[j]++;
r++; T[r]={j,k,Start[i]}; Start[i]=r;
r++; T[r]={i,k,Start[j]}; Start[j]=r;
}
fin.close();
}
void ciclu_eulerian(){
ofstream fout("ciclueuler.out");
int k,r,i,ul,w,p,q;
E[0]={1,-1};///"ciclul" [1] de lungime 0
r=0;k=0;
while(k!=-1 && r<m){
///caut pornire pentru un subciclu
while(grad[E[k].x]){
///subciclul incepe cu E[k].x
///si se va insera la dreapta lui E[k]
ul=k;
w=E[ul].urm; E[ul].urm=-1;
do{
p=E[ul].x;
for(i=Start[p];i;i=T[i].urm){
q=T[i].x;
if(!vizm[T[i].pozm]){
///adaug varful q subciclului
r++; E[r]={q,0}; E[ul].urm=r; ul=r;
vizm[T[i].pozm]=true;
grad[p]--; grad[q]--;
Start[p]=T[i].urm;
break;
}
}
}while(q!=E[k].x);
E[ul].urm=w;
}
k=E[k].urm;
}
if(r<m){fout<<-1;return;}
for(k=0,i=0;i<m;k=E[k].urm,i++){
fout<<E[k].x<<" ";
}
fout.close();
}
} G;
int main()
{
G.citire();
G.ciclu_eulerian();
return 0;
}