Pagini recente » Cod sursa (job #233383) | Cod sursa (job #1485697) | Cod sursa (job #1213706) | Cod sursa (job #958015) | Cod sursa (job #982941)
Cod sursa(job #982941)
#include<fstream>
#include<vector>
#define Nmax 100099
#define Mmax 500099
#define x first
#define y second
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,m,sol[Mmax];
//struct muchie{int x,y}Much;
bool viz[Mmax];
vector <int> Graph[Nmax];
vector <pair <int,int> >Much;
inline void Citire()
{
f>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
f>>x>>y;//citesc capetele muchiei i
Much.push_back(make_pair(x,y));
//pentru un nod x , Graph[x] reprezinta lista indicilor muchiilor incidente cu x
Graph[x].push_back(i);
Graph[y].push_back(i);
}
}
inline bool EsteEulerian()
{
//daca gradul nodului i este impar,atunci graful nu este eulerian
for(int i=1;i<=n;i++)
if(Graph[i].size() % 2==1) return false;
return true;
}
inline void Euler(int nod)
{
//parcurg lista muchiilor incidente cu nod
vector <int>::iterator it;
for(it=Graph[nod].begin();it!=Graph[nod].end();it++)
if(!viz[*it]) //daca muchia mai exista
{
viz[*it]=true; //o sterg
//vizitez celalalt capat al muchiei
Euler(Much[*it-1].x+Much[*it-1].y-nod);
}
//dupa ce nodul nod a ramas cu gradul 0,este pus in ciclu
sol[++sol[0]]=nod;
}
int main()
{
Citire();
bool ok=EsteEulerian(); //verific daca graful poate fi eulerian
if(!ok)
{
//nu este graf eulerian
g<<-1<<"\n";
f.close();g.close();
return 0;
}
else
{
Euler(1); //determin ciclul eulerian
//afisez ciclul eulerian gasit
for(int i=1;i<=sol[0];i++)g<<sol[i]<<' ';
g<<'\n';
}
f.close();g.close();
return 0;
}