Pagini recente » Cod sursa (job #2672983) | Cod sursa (job #2907948) | Cod sursa (job #2355189) | Cod sursa (job #2385968) | Cod sursa (job #2025652)
#include<stdio.h>
#include<utility>
#include<vector>
#define MAXV 100000
#define MAXE 500000
struct Edge
{
int src;
int dst;
};
void euler(int nod);
FILE*fin,*fout;
int st[MAXE+1];
int ult=-1;
std::vector<int> neighbors[MAXV+1];
std::vector<int> sol;
Edge edges[MAXE+1];
bool viz[MAXE+1];
int nr_edges[MAXV+1];
int V,E;
int main()
{
fin=fopen("ciclueuler.in","r");
fout=fopen("ciclueuler.out","w");
fscanf(fin,"%d%d",&V,&E);
for(int i=1; i<=E; i++)
{
int src,dst;
fscanf(fin,"%d%d",&src,&dst);
neighbors[src].push_back(i);
neighbors[dst].push_back(i);
edges[i].src=src;
edges[i].dst=dst;
nr_edges[src]++;
nr_edges[dst]++;
}
bool ok=1;
for(int i=1; i<=V && ok; i++)
{
if(nr_edges[i]%2==1)
{
ok=0;
}
}
if(ok)
{
euler(1);
for(int i=0;i<sol.size()-1;i++)
{
fprintf(fout,"%d ",sol[i]);
}
}
else
{
fprintf(fout,"-1");
}
fclose(fin);
fclose(fout);
return 0;
}
void euler(int nod)
{
st[++ult]=nod;
while(ult>=0)
{
nod=st[ult];
if(!neighbors[nod].empty())
{
//printf("aici %d",nod);
int muchie=neighbors[nod].back();
neighbors[nod].pop_back();
if(!viz[muchie])
{
viz[muchie]=1;
int to;
if(nod==edges[muchie].src)
{
to=edges[muchie].dst;
}
else
{
to=edges[muchie].src;
}
st[++ult]=to;
}
}
else
{
ult--;
sol.push_back(nod);
}
}
}