Pagini recente » Cod sursa (job #1799152) | Cod sursa (job #1172176) | Cod sursa (job #2667757) | Cod sursa (job #946590) | Cod sursa (job #735596)
Cod sursa(job #735596)
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <fstream>
using namespace std;
#define nmax 100010
#define pb push_back
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
vector<long> graph[nmax];
vector<long> degree(nmax);
vector<long> solution;
long n,m,x,y;
void read_input()
{
in>>n>>m;
for(long i=0;i<m;i++)
{
in>>x>>y;
graph[x].pb(y);
graph[y].pb(x);
degree[x]++;
degree[y]++;
}
}
int Eulerian()
{
//verificare daca exista nod cu grad impar
for(long i=1;i<=n;i++) if(degree[i]%2) return 0;
//verificam daca e conex
/* queue<long> q;
q.push(1);
vector<bool> visited(nmax);
visited[1]=true;
while(!q.empty())
{
long node=q.front();
q.pop();
for(long i=0;i<graph[node].size();i++)
{
if(visited[graph[node][i]]==false)
{
q.push(graph[node][i]);
visited[graph[node][i]]=true;
}
}
}
for(long i=1;i<=n;i++) if(visited[i]==false) return 0;*/
return 1;
}
void euler(long start)
{
stack <long> s;
s.push(start);
while(!s.empty())
{
long node=s.top();
// printf("plec din nodul %ld\n", node);
while(!graph[node].empty())
{
long nextNode= *graph[node].begin();
// printf("nextNode=%ld\n", nextNode);
graph[nextNode].erase(find(graph[nextNode].begin(),graph[nextNode].end(),node));
graph[node].erase(graph[node].begin());
s.push(nextNode);
node=nextNode;
}
// printf("nodul final = %ld\n", s.top());
solution.pb(s.top());
s.pop();
}
solution.pop_back();
for(int i=0;i<solution.size();i++) out<<solution[i]<<' ';
}
int main()
{
int i;
read_input();
if(Eulerian()) euler(1);
else out<<-1<<'\n';
return 0;
}