Pagini recente » Cod sursa (job #254496) | Cod sursa (job #1289803) | Cod sursa (job #2299660) | Cod sursa (job #2088111) | Cod sursa (job #2811802)
#include <bits/stdc++.h>
#define N 100001
#define M 500001
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
typedef pair < int, int > Pair; // define our pair for an easier use
vector < Pair > graf[N]; // garf[x] = (nr_muchie, y) --> ca sa stim sa marcam o singura data muchia ca fiind folosita
// graf[y] = (nr_muchie, x)
bool eliminated[M]; //the edges that will be eliminated
stack<int> stack_nodes;
vector<int> euler_cicle;
int n, m;
void Euler()
{
/*
adăugăm pe stivă un vârf oarecare – de exemplu 1;
cât timp stiva nu este vidă
fie k – nodul din vârful stivei
determinăm nodurile x adiacente cu k. Eliminăm muchia [k,x] și adăugăm nodul x pe stivă (apel recursiv)
continuăm cu nodul situat în vârful stivei
adăugăm nodul k într-o listă
eliminăm nodul k din stivă
lista construită reprezintă ciclu eulerian
*/
///alg Fleury: pornim de la un nod oarecare si, la fiecare pas, parcurgem o muchie a carei stergere din graf nu l-ar deconecta. Stergem muchia respectiva si,
///deplasandu-ne in celalalt capat al ei,continuam algoritmul in aceeasi maniera pana cand vom epuiza toate muchiile grafului. Ciclul obtinut este Eulerian.
for(int i = 1; i <= m; ++i)
{
int x, y;
fin >> x >> y;
graf[x].push_back(make_pair(i, y));
graf[y].push_back(make_pair(i, x));
}
for(int i = 1; i <= n; ++i)
if(graf[i].size() %2 == 1)//it can't have an euler cicle
{
fout << -1;
return;
}
stack_nodes.push(1);
while(!stack_nodes.empty())//like a dfs
{
int node = stack_nodes.top();
if(!graf[node].empty())//if it still has neighbours
{
Pair p = graf[node].back();
graf[node].pop_back();
int nr_edge = p.first;
int vertex = p.second;
if(!eliminated[nr_edge])
{
eliminated[nr_edge] = 1; //we eliminate it
stack_nodes.push(vertex);//will continue from here
}
}
else //we can add it to the solution
{
stack_nodes.pop();
euler_cicle.push_back(node);
}
}
for(int i = 0; i < euler_cicle.size() - 1; ++i)
fout << euler_cicle[i] << " ";
}
int main()
{
fin >> n >> m;
Euler();
return 0;
}