Pagini recente » Istoria paginii runda/iuiui | Cod sursa (job #1796614) | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2821787)
#include <iostream>
#include <bits/stdc++.h>
#define MAX_N 100001
#define MAX_M 500001
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n, m;
vector<bool> visited(MAX_N);
vector<int> grad(MAX_N);
vector<int> sters(MAX_M);
vector<pair<int,int>> adj[MAX_N];
unordered_map<int,int> edge_count;
stack<int> stiva;
void DFS(int x)
{
visited[x] = true;
for (auto vecin: adj[x])
if (!visited[vecin.first])
DFS(vecin.first);
}
void euler(int x)
{
while (!adj[x].empty())
{
while (!adj[x].empty() && sters[adj[x].back().second]) {
adj[x].pop_back();
}
if (!adj[x].empty())
{
int urm = adj[x].back().first;
int nrMuchie = adj[x].back().second;
sters[nrMuchie] = 1;
adj[x].pop_back();
euler(urm);
}
}
stiva.push(x);
}
int main()
{
int first, second, nr_muchie = 0;
f>>n>>m;
for (int i = 1; i <= m; i++)
{
nr_muchie++;
f>>first>>second;
adj[first].push_back(make_pair(second, nr_muchie));
adj[second].push_back(make_pair(first, nr_muchie));
}
DFS(1);
for (int i = 1; i <= n; i++)
{
edge_count[i] = adj[i].size();
if (edge_count[i] % 2 != 0 || !visited[i])
{
g<<-1;
return 0;
}
}
euler(1);
while (!stiva.empty())
{
if (stiva.size() > 1)
g<<stiva.top()<<" ";
stiva.pop();
}
return 0;
}