Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- int main( )
- {
- // Количество вершин графа
- int n;
- cin >> n;
- // Таблица расстояний графа
- vector< vector< int > > G(n, vector< int >(n));
- // Ввод дерева
- for (int i = 0; i < n; ++i)
- {
- for (int j = 0; j < n; ++j)
- {
- int dist;
- cin >> dist;
- if (dist < 0) dist = INT32_MAX;
- G[i][j] = G[j][i] = dist;
- }
- }
- //*****************************************
- // Корень остовного дерева
- int v_from;
- cin >> v_from;
- // Массив посещённых вершин, иницилизируем 0
- vector< bool > visited(n, false);
- vector< int > min_d(n, INT32_MAX), near(n, v_from);
- min_d[v_from] = 0;
- // Является ли граф связным
- bool not_connect = false;
- // Просматриваем все вершины графа
- for (int i = 0; i < n; ++i)
- {
- // Находим вершину, путь в которую от остовного дерева минимален
- int min_v = -1;
- for (int j = 0; j < n; ++j)
- {
- if (!visited[j] && (min_v == -1 || min_d[j] < min_d[min_v]))
- {
- min_v = j;
- }
- }
- // Если данная вершина имеет расстояние от корня остова равное inf
- // то значит эта вершина находится в другой компоненте связности
- // следовательно постоить остов графа невозможно
- if (min_d[min_v] == INT32_MAX)
- {
- not_connect = true;
- break;
- }
- // "Посещаем" данную вершину и "вносим" её в остов
- visited[min_v] = true;
- // Пересматриваем другие расстояния в остовном графе с учетом новой вершины
- for (int k = 0; k < n; ++k)
- {
- if (G[min_v][k] < min_d[k] && !visited[k])
- {
- min_d[k] = G[min_v][k];
- near[k] = min_v;
- }
- }
- }
- // Если граф связный, выводим
- if (!not_connect)
- {
- for (int i = 0; i < n; ++i)
- {
- cout << near[i] << ' ';
- }
- cout << endl;
- for (int i = 0; i < n; ++i)
- {
- cout << min_d[i] << ' ';
- }
- cout << endl;
- }
- else
- {
- // Граф не связный
- cout << "Graph is not connected!" << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement