Pagini recente » Cod sursa (job #2030069) | Cod sursa (job #987535) | Cod sursa (job #2099679) | Cod sursa (job #1917876) | Cod sursa (job #987884)
Cod sursa(job #987884)
#include<fstream>
#include<vector>
using namespace std;
int n,m,X[500500],Y[500500],sol[500500],nr,siz[500500];
bool viz[500500];
vector <int> G[100100];
ofstream fout("ciclueuler.out");
inline void Citire()
{
int i;
ifstream fin("ciclueuler.in");
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>X[i]>>Y[i]; //citesc capetele muchiei i
//pentru un nod x , G[x] reprezinta lista indicilor muchiilor incidente cu x
G[X[i]].push_back(i); siz[X[i]]++;
G[Y[i]].push_back(i); siz[Y[i]]++;
}
fin.close();
}
inline bool Eulerian()
{
int i;
for(i=1;i<=n;i++)
if(siz[i]%2==1) //daca gradul nodului i este impar,atunci graful nu este eulerian
return false;
return true;
}
inline void Euler(int nod)
{
int i;
while(siz[nod]) //parcurg lista muchiilor incidente cu nod
{
i=*(G[nod].end()-1);
G[nod].pop_back();
siz[nod]--;
if(!viz[i]) //daca muchia mai exista
{
viz[i]=true; //o sterg
Euler(X[i]+Y[i]-nod); //vizitez celalalt capat al muchiei
}
}
sol[++nr]=nod; //dupa ce nodul nod a ramas cu gradul 0,este pus in ciclu
}
int main()
{
Citire();
bool ok=Eulerian(); //verific daca graful poate fi eulerian
if(!ok)
{
fout<<-1<<"\n"; //nu este graf eulerian
fout.close();
return 0;
}
else
{
int i;
Euler(1); //determin ciclul eulerian
for(i=1;i<=nr;i++)
fout<<sol[i]<<' '; //afisez ciclul eulerian gasit
fout<<"\n";
fout.close();
}
return 0;
}