Pagini recente » Cod sursa (job #277805) | Cod sursa (job #2478509) | Cod sursa (job #1541967) | Cod sursa (job #1095233) | Cod sursa (job #1836942)
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
bool is_eulerian(int n, const vector<list<int>> &Adj){
for(int i=1;i<=n;++i)
if(Adj[i].size() % 2 !=0)
return false;
queue<int> q;
vector<bool> visited(n+1,false);
q.push(1);
visited[1]=true;
while(!q.empty()){
int v = q.front();
q.pop();
for(auto it = Adj[v].begin(); it!=Adj[v].end();++it)
if(!visited[*it]){
visited[*it]=true;
q.push(*it);
}
}
for(int i=1;i<=n;++i)
if(!visited[i])
return false;
return true;
}
int main()
{
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n,m;
fin>>n>>m;
vector< list<int> > Adj(n+1);
for(int i=0;i<m;++i){
int a,b;
fin>>a>>b;
Adj[a].push_back(b);
Adj[b].push_back(a);
}
if(is_eulerian(n,Adj)){
std::list<unsigned> ciclueul;
std::stack<unsigned> S;
unsigned v=1;
do{
while(!Adj[v].empty()){
unsigned w=*Adj[v].begin();
S.push(v);
Adj[w].erase(std::find(Adj[w].begin(),Adj[w].end(),v)); //erase edge v <-> w;
Adj[v].erase(Adj[v].begin());
v=w;
}
v=S.top();
ciclueul.push_front(v); S.pop();
} while(!S.empty());
for(auto i=ciclueul.begin();i!=ciclueul.end();++i) fout<<*i<<' ';
fout<<'\n';
}
else
fout<<"-1\n";
}