Pagini recente » Cod sursa (job #617437) | Cod sursa (job #83583) | Cod sursa (job #974083) | Cod sursa (job #2775401) | Cod sursa (job #470944)
Cod sursa(job #470944)
#include<fstream>
#include<list>
#include<iostream>
#define NMAX 100005
#define MMAX 500005
using namespace std;
int c1[MMAX],c[MMAX];
int i,n,m,x,y,k1,k=0,grad[NMAX],viz[NMAX];
list<int> a[NMAX];
typedef list<int>::iterator ITL;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
void DFS(int nod)
{
ITL it;
viz[nod]=1;
for (it=a[nod].begin();it!=a[nod].end();it++)
if (!viz[*it])DFS(*it);
}
bool verifica()
{
int i;
for (i=1;i<=n;i++)
if (!viz[i]||grad[i]%2)return 0;//daca nodul i nu este vizitat sau daca gradul este impar atunci se iese
return 1;
}
void ciclu(int x , int LOC)
{
ITL it;
int vl,j;
while( c1[k1]!=c1[1] || c1[k1]==c1[1] && k1==1)
{
x=c1[k1];
vl=*a[x].begin();
a[x].pop_front();
//cout<<x<<" "<<vl<<" ";
for(it=a[vl].begin();it!=a[vl].end();it++)
if (*it==x) break;
a[vl].erase(it);//stergem
grad[x]--;grad[vl]--;//modificam gradele
k1++;c1[k1]=vl;
}
for (j=k;j>=LOC;j--) c[j+k1-1]=c[j];
for (j=1;j<=k1-1;j++) c[j+LOC]=c1[j+1];
}
void write(int k)
{
g<<c[1];
for (i=2;i<=k;i++)
g<<" "<<c[i];
g<<"\n";
}
int main(){
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>x>>y;
a[x].push_back(y);//adaug nodul y in losta x
a[y].push_back(x);//adaug nodul x in lista y
grad[x]++;grad[y]++;//maresc gradele nodurilor
}
DFS(1);//declansam parcurgerea grafului
if (!verifica()) g<<"-1\n";
else
{
while (k-1<m)
{
for(i=1;i<=k-1;i++)//cautam un nod de plecare
if (grad[c[i]]>0)break;
if (k>0)
{
c1[1]=c[i];k1=1;
ciclu(c[i],i);
}
else
{
k++;c[k]=1;
c1[1]=1;k1=1;
ciclu(1,1);
}
k=k+k1-1;//modificam lungimea lui c
}
}
write(k);//scriem solutia gasita
f.close();
g.close();
return 0;
}