【c++/euler】套圈法解有向图的欧拉回路

来源:互联网 发布:淘宝财富值怎么刷的 编辑:程序博客网 时间:2024/06/15 12:46

【参考】Matching_Euler_Tours_and_the_Chinese_Postman

[REPRESENTATION]The edge-pairingrepresentation【表示方法】边对表示法




【核心方法】

void Model::findEuler(int index, Node * node, Edge * edge){Node* node_a = node;Edge* edge_a = edge;while (true){Node* node_b = edge_a->getInNode();Edge* edge_b = NULL;for (auto &tmp_e : node_b->getOutEdges()){if (!tmp_e->getMark()){edge_b = tmp_e;break;}}if (edge_b != NULL){pair<Edge*, Edge*> tmp_pair;tmp_pair.first = edge_a;tmp_pair.second = edge_b;edge_a->setMark(true);edge_b->setMark(true);_edgePairs.push_back(tmp_pair);}else//if(edge_b==NULL){break;}node_a = node_b;edge_a = edge_b;}if (index != -1){pair<Edge*, Edge*> tmp_pair;tmp_pair.first = edge_a;tmp_pair.second = _edgePairs[index].second;_edgePairs.push_back(tmp_pair);_edgePairs[index].second = edge;}return;}

【外层方法】

               if (nodes.size() > 0){Node* node_0 = nodes.front();Edge* edge_0 = node_0->getOutEdges().front();findEuler(-1, node_0, edge_0);for (auto &tmp_n : nodes){for (auto &tmp_e : tmp_n->getOutEdges()){if (!tmp_e->getMark()){findEuler(getOneEdgePairIndex(tmp_n), tmp_n, tmp_e);//第一个参数为相交在tmp_n的一对边}}}}cout << "# Edge pairs:" << _edgePairs.size() << endl;cout << "# Finish find the euler route" << endl;/*output the route*/int pair_size = _edgePairs.size();bool * print_mark = new bool[pair_size];for (int i = 0; i < pair_size; ++i){print_mark[i] = false;}Edge* cur_edge = _edgePairs[0].first;Edge* next_edge = _edgePairs[0].second;print_mark[0] = true;/*print*/cur_edge->print();while (next_edge != NULL){/*print*/next_edge->print();cur_edge = next_edge;next_edge = NULL;/*find next edge*/for (int i = 1; i < pair_size; ++i){if (!print_mark[i]){if (_edgePairs[i].first == cur_edge){next_edge = _edgePairs[i].second;print_mark[i] = true;break;}}}}


0 0