Pagini recente » Cod sursa (job #2892992) | Cod sursa (job #1149879) | Cod sursa (job #2351343)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n, m,Viz[100001],ce[500001], ce1[500001],Gr[100001],numar;
vector <int> L[100001];
void Citire()
{ int i, x, y;
f>>n;
while(f>>x>>y)
{ m++;
L[x].push_back(y);
L[y].push_back(x);
}
}
void DFS(int k)
{ Viz[k]=1;
int j,nr;
for(j=0;j<L[k].size();j++)
{ nr=L[k][j];
if(Viz[nr]==0)
DFS(nr);
}
}
void Afisare()
{ int i,j ;
cout<<n<<" "<<m<<endl;
for(i=1;i<=n;i++)
{ cout<<i<<": ";
for(j=0;j<L[i].size();j++)
cout<<L[i][j]<<" ";
cout<<endl;
}
}
int main()
{ int i, k,nr,j,p;
Citire();
DFS(1);
int ok=0;
for(i=1;i<=n&&ok==0;i++)
if(Viz[i]==0)
ok=1;
if(ok==1)
cout<<-1;
else { k=1;
ok=0;
for(i=1;i<=n&&ok==0;i++)
{nr=L[i].size();
if(nr%2==0)
Gr[i]=nr;
else ok=1;
}
if(ok==1)
cout<<-1;
}
if(ok==0)
{ ce[1]=1;k=1;
do{
for(j=0;j<L[ce[k]].size();j++)
{ numar=L[ce[k]][j];
L[ce[k]].erase(L[ce[k]].begin()+j);
for(p=0;p<L[numar].size();p++)
if(L[numar][p]==ce[k])
{
L[numar].erase(L[numar].begin()+p);
break;
}
Gr[ce[k]]--;
Gr[numar]--;
k++;
ce[k]=numar;
break;
}
}while(ce[k]!=ce[1]);
int v, k1;
while(k<m+1)
{ for(i=1;i<=k;i++)
if(Gr[ce[i]]>0)
{ v=i;
ce1[1]=ce[i];
k1=1;
break;
}
do{
for(j=0;j<L[ce1[k1]].size();j++)
{ numar=L[ce1[k1]][j];
L[ce1[k1]].erase(L[ce1[k1]].begin()+j);
for(p=0;p<L[numar].size();p++)
if(L[numar][p]==ce1[k1])
{
L[numar].erase(L[numar].begin()+p);
break;
}
Gr[ce1[k1]]--;
Gr[numar]--;
k1++;
ce1[k1]=numar;
break;
}
}while(ce1[k1]!=ce1[1]);
for(i=k;i>=v+1;i--)
ce[i+k1-1]=ce[i];
for(i=2;i<=k1;i++)
ce[v+i-1]=ce1[i];
//Afisare();
k=k+k1-1;
}
g<<k<<endl;
for(i=1;i<=k;i++)
g<<ce[i]<<" ";
}
f.close();
g.close();
return 0;
}