Вывод нескольких графиков в 1 Graphviz
#include <iostream>
#include <set>
#include <map>
#include <algorithm>
#include<vector>
#include <windows.h>
#define _SCL_SECURE_NO_WARNINGS
#include <boost/graph/graphviz.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/iteration_macros.hpp>
using namespace std;
vector<pair<string, string>> woodEdges;
map<string, vector<string>> AdjacencyList;
vector<pair<string, int>> steps;
vector<vector<string>> cycles;
void saveCycle(const string& start, const string& end) {
string tmp = end;
// vector<vector<string>> cycles;
cycles.push_back({});
while (tmp != start) {
// {{}, {}, {} <- добавление temp в последний массив}
cycles[cycles.size() - 1].push_back(tmp);
// среди woodEdges найти pair<first, second>
// tmp = woodEdges.find(edge => edge.first === temp).second;
for (const auto& edge: woodEdges) {
if (edge.second == tmp) {
tmp = edge.first;
break;
}
}
}
// {{}, {}, {} <- добавление temp в последний массив}
cycles[cycles.size() - 1].push_back(tmp);
// {{}, {}, {} <- развернуть последний массив}
std::reverse(cycles[cycles.size() - 1].begin(), cycles[cycles.size() - 1].end());
// {{}, {}, {} <- вывод на экран последнего массива}
for (const auto& x: cycles[cycles.size() - 1]) { //Выводим цикл
cout << x << " ";
}
cout << "Cycle saved" << endl<<endl;
}
void FSC(const string& node, int depth) {
steps.push_back(make_pair(node, depth));
depth++;
for (const auto& friendNode: AdjacencyList.at(node)) { // adjencyList.at(node): {"", "", ""} - вершины смежные с node
cout << "Node|Friend " << node << " " << friendNode << endl<<endl;
bool isFriendNodeInSteps = false; // if (!steps.find(step => step.node === friend)) {
for (const auto& step: steps) {
if (step.first == friendNode) {
isFriendNodeInSteps = true;
}
}
if (!isFriendNodeInSteps) {
cout << "Push to woodEdges " << node << " " << friendNode << endl<<endl;
woodEdges.push_back(make_pair(node, friendNode));
FSC(friendNode, depth);
} else {
for (const auto& x: woodEdges) { // else if (woodEdges.find(edge => edge.data.source === node && edge.data.target !== friend))
if (x.first == node && x.second != friendNode) {
cout << "Cycle found reverse edge of the original edge " << x.first << " " << x.second << endl<<endl;
saveCycle(node, friendNode);
}
}
}
}
}
void FundamentalSystemofCycles() {
cout << "FundamentalCutsBasis() run" << endl<<endl;
int depth = 0;
FSC(AdjacencyList.begin()->first, depth);
ofstream fout("Cycles.txt");
// print cycles
cout << "Cycles: " << endl<<endl;
for (const auto& cycle: cycles) {
fout << "graph{ ";
for (const auto& x: cycle) {
cout << x << " ";
fout << x;
if (x != cycle[cycle.size() - 1]) fout << "--";
else fout <<"--"<<cycle[0];
}
cout << endl<<endl;
fout << endl << "}" << endl<<endl;
}
fout.close();
system("dot Cycles.txt -Tpng -OCycles.png");
// print woodEdges
cout << "WoodEdges" << endl<<endl;
for (const auto& x: woodEdges) {
cout << x.first << " " << x.second << endl<<endl;
}
cout << "Cyclomatic number of the graph G: " << cycles.size() << endl << endl;
}
vector<pair<string, string>> createEdgesFromCycle(vector<string> cycle) { //делим цикл на ребра
vector<pair<string, string>> edges;
for (int i = 0; i < cycle.size(); i++) {
edges.push_back(make_pair(cycle[i], cycle[(i + 1) % cycle.size()]));
}
return edges;
}
void FundamentalCutsSystem() {
cout << "FundamentalCutsSystem() run" << endl << endl;
vector<vector<pair<string, string>>> edgedCycles;
for (const auto& cycle: cycles) {
edgedCycles.push_back(createEdgesFromCycle(cycle)); //записываем в edgedCycles массив с ребрами цикла
}
vector<vector<pair<string, string>>> cuts;
for (const auto& edge: woodEdges) {
cuts.push_back({edge});
for (const auto& cycle: edgedCycles) {
for (const auto& cycleEdge: cycle) {
if (cycleEdge.first == edge.first && cycleEdge.second == edge.second) {
cuts[cuts.size() - 1].push_back(cycle[cycle.size() - 1]);
}
}
}
}
ofstream fout("Cuts.txt");
cout << "Cuts: " << endl<<endl;
for (const auto& cut: cuts) { //вывод разрезов
fout << "graph{ "<<endl;
for(const auto& edge: cut) {
cout << edge.first << " " << edge.second << endl;
fout << edge.first << "--" << edge.second << endl;
}
cout << endl;
fout <<endl<< "} "<<endl;
}
system("dot Cuts.txt -Tpng -OCuts.png");
cout << "Number of cuts: " << cuts.size();
}
int main() {
// IEdje[] = vector<pair<string, string>>
// map<string, vector<string>> adjencyList;
setlocale(LC_ALL, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
AdjacencyList["1"] = {"2", "3", "4", "5"};
AdjacencyList["2"] = {"1", "3", "4", "5"};
AdjacencyList["3"] = {"1", "2", "4"};
AdjacencyList["4"] = {"1", "2", "3"};
AdjacencyList["5"] = {"1", "2"};
ifstream in("input1.txt");
in.close();
system("dot input1.txt -Tpng -oInputGraph.png");
FundamentalSystemofCycles();
FundamentalCutsSystem();
};
В функции FundamentalSystemofCycles() у меня выводятся ребра всех 4 циклов в файл Cycles.txt и потом это все преобразуется в 4 png картинки.В функции FundamentalCutsSystem() точно также, только с разрезами. Можно как-то вывести циклы в одном файле и разрезы тоже в одном отдельном файле. Но так,чтобы не конфликтовали одинаковые вершины. А то он мне все соединит. А мне надо прям 4 цикла на одной картинке разных. Но они с теми же вершинами