Pagini recente » Cod sursa (job #2002255) | Cod sursa (job #1623262) | Cod sursa (job #2471936) | Cod sursa (job #1372364) | Cod sursa (job #515946)
Cod sursa(job #515946)
// http://infoarena.ro/problema/ciclueuler
#include <fstream>
#include <vector>
#include <list>
using namespace std;
int nodes,edges;
vector< list<int> > graph;
list<int> cycle;
void read();
bool eulerianCycle();
void euler(int toVisit);
void write(bool status);
int main() {
read();
if(eulerianCycle()) {
euler(1);
write(true);
}
else
write(false);
return (0);
}
void read() {
ifstream in("ciclueuler.in");
int from,to;
in >> nodes >> edges;
graph.resize(nodes+1);
for(int i=1;i<=edges;i++) {
in >> from >> to;
// multigraf
graph.at(from).push_back(to);
graph.at(to).push_back(from);
}
in.close();
}
bool eulerianCycle() {
for(int i=1;i<=nodes;i++)
if(graph.at(i).size() % 2)
return false;
return true;
}
void euler(int toVisit) {
list<int>::iterator it;
list<int>::iterator secondIt;
it = graph.at(toVisit).begin();
while(it != graph.at(toVisit).end()) {
secondIt = graph.at(*it).begin();
int next = *it; // it isi va pierde valoare
while(secondIt != graph.at(*it).end()) {
if(*secondIt == toVisit) {
graph.at(*it).erase(secondIt);
break;
}
secondIt++;
}
graph.at(toVisit).pop_front();
euler(next);
it = graph.at(toVisit).begin();
}
cycle.push_back(toVisit);
}
void write(bool status) {
ofstream out("ciclueuler.out");
list<int>::iterator it;
it = cycle.begin();
it++;
if(status)
for(;it!=cycle.end();it++)
out << *it << " ";
else
out << "-1\n";
out.close();
}