Pagini recente » Cod sursa (job #721638) | Cod sursa (job #1428567) | Cod sursa (job #721557) | Cod sursa (job #2465402) | Cod sursa (job #3330843)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int NMAX = 100000;
const int MMAX = 500000;
int N, M;
vector<pair<int, int>> G[NMAX + 1];
vector<bool> vizitat(MMAX + 1, false);
vector<int> solutie;
// conex + toate nodurile au grad par
// toate muchiile sunt vizitate o singura data
// alg lui Fleury
// complexitate O(V+E)
void ReadInput() {
ifstream fin("ciclueuler.in");
fin >> N >> M;
for(int i = 1; i <= M ; i ++) {
int u, v;
fin >> u >> v;
// i = id al muchiei pentru a nu o folosi din nou
G[u].push_back({v, i});
G[v].push_back({u, i});
}
fin.close();
}
void Euler(int nod) {
while (!G[nod].empty()){
pair<int, int> muchie = G[nod].back();
G[nod].pop_back();
int v = muchie.first;
int id = muchie.second;
if (vizitat[id] == false) {
vizitat[id] = true;
Euler(v);
}
}
solutie.push_back(nod);
}
int main(){
ReadInput();
for(int i = 1; i <= N; i ++) {
// daca nu are nr par de vecini => nu e eulerian
if (G[i].size() % 2 == 1){
cout << -1 << endl;
return 0;
}
}
Euler(1);
ofstream fout("ciclueuler.out");
for (int i = 0; i < M; i ++){
fout << solutie[i] << " ";
}
fout << endl;
fout.close();
return 0;
}