Pagini recente » Cod sursa (job #540380) | Cod sursa (job #955501) | Cod sursa (job #2607521) | Cod sursa (job #1970656) | Cod sursa (job #3001987)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
struct muchie {
int nod, typ;
bool operator < (const muchie &ceva) const {
if(ceva.typ == typ) {
return ceva.nod < nod;
}
return ceva.typ > typ;
}
};
int N, M;
bool vizi[40001];
vector<int> adi[100001];
set<muchie> adi2[100001];
void dfs(int nod, int vechi) {
//cout << "sunt in " << nod << "\n";
muchie y;
vizi[nod] = true;
for(auto it : adi[nod]) {
if(!vizi[it]) {
y.nod = it;
y.typ = 1;
adi2[nod].insert(y);
y.nod = nod;
adi2[it].insert(y);
dfs(it, nod);
}
else if(it != vechi || it == nod) {
//cout << "inserez cu prioritate 0: " << nod << " " << it << "\n";
y.nod = it;
y.typ = 0;
adi2[nod].insert(y);
if(it != nod) {
y.nod = nod;
adi2[it].insert(y);
}
}
}
}
void euler(int nod) {
//fout << "are lungimea " << adi2[nod].size() << "\n";
// for(auto it : adi2[nod]) {
// fout << "spre " << (it.nod) << "cu prioritate " << it.typ << ", ";
// }
// fout << "\n";
if(adi2[nod].size() == 0) {
//fout << "S-a goliit\n";
return;
}
fout << nod << " ";
auto it = adi2[nod].begin();
//mergem in acest nod, dar stergem si muchia
int nou = it->nod;
int tp = it->typ;
muchie y;
y.nod = nou;
y.typ = tp;
adi2[nod].erase(y);
if(nou != nod) {
y.nod = nod;
adi2[nou].erase(y);
}
euler(nou);
}
int main() {
fin >> N >> M;
int a, b, start;
for(int i = 1; i <= M; i++) {
fin >> a >> b;
adi[a].push_back(b);
if(a != b)
adi[b].push_back(a);
}
start = 1;
dfs(start, -1);
euler(start);
return 0;
}