
БДЗ4 / БДЗ4 Колесников ИВТ-15М Вариант 4
.docx
1) С помощью алгоритма Краскала построить минимальный остов.
Код:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct edge {
string node1;
string node2;
int length;
edge(string n1,string n2, int l) {
node1 = n1;
node2 = n2;
length = l;
}
};
bool sorting_edges(edge e1,edge e2) {
return e1.length < e2.length;
}
int main()
{
vector<edge> edges{ {"x1","x2",1},{"x1","x3",2},{"x1","x5",3},{"x1","x6",4},
{"x2","x3",2},{"x2","x5",3},
{"x3","x4",3},
{"x4","x6",3},
{"x5","x6",4},
};
vector<edge> minspantree;
vector<string> used_nodes;
sort(edges.begin(), edges.end(), sorting_edges);
minspantree.push_back(edges[0]);
used_nodes.push_back(edges[0].node1);
used_nodes.push_back(edges[0].node2);
for (int i = 1;i < edges.size();i++) {
if (find(used_nodes.begin(), used_nodes.end(), edges[i].node2)== used_nodes.end()) {
minspantree.push_back(edges[i]);
used_nodes.push_back(edges[i].node2);
}
if (used_nodes.size() == 6)break;
}
for (int i = 0;i < minspantree.size();i++)cout << minspantree[i].node1 << " " << minspantree[i].length << " " <<
minspantree[i].node2 << "\n";
}
Результат:
x1 1 x2
x1 2 x3
x1 3 x5
x3 3 x4
x4 3 x6
2) Найти код Прюфера полученного дерева.
Код:
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
struct edge {
int node1;
int node2;
edge(int n1,int n2) {
node1 = n1;
node2 = n2;
}
};
int main()
{
vector<edge> edges{ {1,2},{1,3},{1,5},
{3,4},
{4,6},
};
vector<int> code;
while (edges.size() > 1) {
map<int, int> nodes_num;
int min_num = 6;
for (int i = 0;i < edges.size();i++) {
if (nodes_num.find(edges[i].node1) == nodes_num.end()) {
nodes_num.insert(pair<int,int>(edges[i].node1, 1));
}
else {
nodes_num.at(edges[i].node1) += 1;
}
if (nodes_num.find(edges[i].node2) == nodes_num.end()) {
nodes_num.insert(pair<int, int>(edges[i].node2, 1));
}
else {
nodes_num.at(edges[i].node2) += 1;
}
}
for (auto const& pair : nodes_num) {
auto key = pair.first;
auto val = pair.second;
if (val == 1) if (key < min_num)min_num = key;
}
for (int i = 0;i < edges.size();i++) {
if (edges[i].node1==min_num) {
code.push_back(edges[i].node2);
edges.erase(edges.begin()+i);
break;
}
else if (edges[i].node2 == min_num) {
code.push_back(edges[i].node1);
edges.erase(edges.begin() + i);
break;
}
}
}
for (int i = 0;i < code.size();i++) {
cout << "x" << code[i] << " ";
}
}
Результат:
x1 x1 x3 x4