Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- // Ребро : начало, конец и его длина
- struct edge
- {
- int x;
- int y;
- int len;
- };
- // Функция сравнения длин рёбер
- int compare(edge a, edge b)
- {
- return a.len < b.len;
- }
- int main( )
- {
- // Количество вершин
- int n;
- cin >> n;
- // Массив рёбер графа
- vector< edge > array_edge;
- // Массив принадлежности компанентам связности вершин графа
- // v - вершина графа, comp[v] = n, где n - номер компоненты
- vector< int > comp(n);
- for (int i = 0; i < n; ++i)
- {
- // первоначально каждой вершине задаем свой номер компоненты
- comp[i] = i;
- }
- // Ввод графа
- for (int i = 0; i < n; ++i)
- {
- for (int j = 0; j < n; ++j)
- {
- int dist;
- cin >> dist;
- if (i < j && (dist != -1))
- {
- // Добавление ребра к массиву ребёр
- edge new_e = {i, j, dist};
- array_edge.push_back(new_e);
- }
- }
- }
- // Сортируем по неубыванию рёбра графа
- sort(array_edge.begin( ), array_edge.end( ), compare);
- // Остов графа
- vector< edge > tree;
- for (auto e_i : array_edge)
- {
- // Перебираем все рёбра из массива рёбер
- if (comp[e_i.x] != comp[e_i.y])
- {
- // Если два конца ребра находятся в разных компонентах связности
- // Добавляем это ребро в дерево
- tree.push_back(e_i);
- // Записываем номер компоненты начала ребра и его конца
- int comp_x = comp[e_i.x],
- comp_y = comp[e_i.y];
- // Проходим по всему списку компонент
- for (int i = 0; i < n; ++i)
- {
- // Если находим компоненту, равную конечной, присваиваем ей номер компоненты начала ребра.
- if (comp[i] == comp_y)
- comp[i] = comp_x;
- }
- }
- }
- // Если дерево содержит n - 1 рёбер, где n - количество вершин
- if (tree.size() == n - 1)
- {
- // То граф связный
- int sum = 0;
- for (auto k : tree)
- {
- sum += k.len;
- cout << k.len << ' ';
- }
- cout << endl << sum << endl;
- }
- else
- {
- // В обратном случае граф несвязный
- cout << "No connected graph" << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment