Cod sursa(job #1356904)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 23 februarie 2015 17:25:36
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <stdio.h>
#include <vector>


using namespace std;
FILE *f=fopen("ciclueuler.in","r");
FILE *g=fopen("ciclueuler.out","w");



struct cp{
int x;
int ind;
};

vector <cp> aa[100005],b[100005];
cp aux;
vector <int> c;
int uz[100005],use[100005],m,n,i,x,y,ok,j,bbb,tt,cont;
vector <int>::iterator jj;




void dfleury(int k){
vector <cp>::iterator it;
vector <cp>aux1;
int ct=0,ok=0;

aux1.clear();

if (b[k].size()!=0){
for(it=b[k].begin();it!=b[k].end();++it){
aux1.push_back(*it);
if (uz[aux1[ct].ind]==1){c.push_back(aux1[ct].x);uz[aux1[ct].ind]=0;ok=1;dfleury(aux1[ct].x);}
ct++;
}
}
if (ok==0)
for(it=aa[k].begin();it!=aa[k].end();++it){
aux1.push_back(*it);
if (uz[aux1[ct].ind]==1){c.push_back(aux1[ct].x);uz[aux1[ct].ind]=0;dfleury(aux1[ct].x);}
ct++;
}





}



void dfs(int k,int val){
vector <cp>::iterator it;
vector <cp>aux1;
cp AUX;

int ct=0;

use[k]=1;
if (val>=0)uz[val]=1;
aux1.clear();

for(it=aa[k].begin();it!=aa[k].end();++it){
aux1.push_back(*it);
if (use[aux1[ct].x]==0)dfs(aux1[ct].x,aux1[ct].ind);
else if(uz[aux1[ct].ind]==0) {

AUX.x=aux1[ct].x;
AUX.ind=aux1[ct].ind;
b[k].push_back(AUX);
AUX.x=k;
b[aux1[ct].x].push_back(AUX);
uz[aux1[ct].ind]=1;
}
ct++;
}

}


int main()
{
fscanf(f,"%d%d",&n,&m);
cont=1;
for(i=1;i<=m;i++){
    fscanf(f,"%d%d",&x,&y);
    aux.x=y;
    aux.ind=cont;
    aa[x].push_back(aux);
    aux.x=x;
    aa[y].push_back(aux);
    cont++;
}
for(i=2;i<=n;i++)
if (aa[i].size()%2==1){ok=1;break;}


if (ok==1)(fprintf(g,"%d",-1));
else {
dfs(1,-99);
c.push_back(1);
dfleury(1);
for(jj=c.begin();jj!=c.end();++jj)
fprintf(g,"%d ",*jj);
}






fclose(g);
return 0;
}