Алгоритм Дейкстры нахождения кратчайшего пути, выбор ребер/вершин

C++ Дана программа в которой выполняется алгоритм поиска кратчайшего расстояния . В данном примере присутствует 5 вершин , нужно реализовать возможность пользователю удалять / выключать вершину ( чтобы кратчайший путь через неё не проходил ) (либо как я понял можно ужалить столбец , но тоже не понимаю , как сделать это нормально ), либо заменить весь столбец нулями (но это я тоже не понимаю как реализовать ) . Я новичок в программирование и в c++ очень плохо разбираюсь .

#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	setlocale(LC_ALL, "");

	vector<int> parent(5, -1); // объявили и сразу заполнили -1-цами в кол-ве 5 штук
	double big_num(10000);
	double matrix[5][5] =
	{ {0.02,5.01,12.05,0.01,0.4},
	  {5.01,0.05,4.01,0.01,1.01},
	  {12.01,4.1,0.2,2.2,0.6},
	  {0.2,0.01,2.21,0.45,5.21},
	  {0.2,1.01,0.21,5.45,0.2} };

	double  pos[5];
	int node[5], min(0), index_min(0);
	for (int i = 0; i < 5; ++i) {
		pos[i] = big_num;
		node[i] = 0;
	}
	for (int i = 0; i < 5; ++i) {
		for (int j = 0; j < 5; ++j) {
			cout << setw(4) << matrix[i][j];
		}
		cout << "\n";
	}
	int x;

	cout << "vvedite x1";

	cin >> x;
	pos[x - 1] = 0; // начальная точка 
	cout << "\n";
	for (int i = 0; i < 4; ++i) {
		min = big_num;
		for (int j = 0; j < 5; ++j) {
			if (!node[j] && pos[j] < min) {
				min = pos[j];
				index_min = j;
			}
		}
		node[index_min] = true;
		for (int j = 0; j < 5; ++j) {
			if (!node[j] && matrix[index_min][j] > 0 && pos[index_min] != big_num && pos[index_min] + matrix[index_min][j] < pos[j]) {
				pos[j] = pos[index_min] + matrix[index_min][j];
				parent.at(j) = index_min; // запоминаем предка вершины j
			}
		}
	}
	int n(0);
	cout << "\nnumber of top? : ";
	cin >> n;

	vector<int>temp; // n - 1, так как не забываем про индексацию
	for (int i = n - 1; i != -1; i = parent.at(i))temp.push_back(i + 1); // а все что здесь делается описано в справке,которую я те кинул
	reverse(temp.begin(), temp.end());
	for (int i = 0; i < temp.size(); ++i)cout << temp.at(i) << " ";

	cout << "\nWeight : " << pos[n - 1] << "\n";

	cout << endl;
	return 0;
	cout << "готово";
}

Так это ж просто, вот вывод всей матрицы построчно:

Чтобы выводить по столбцам (то есть внутренний цикл каждый раз будет проходить весь какой-то столбец, а не строку) можно поменять местами циклы (или i и j).

	for (int j = 0; j < 5; ++j) {
		for (int i = 0; i < 5; ++i) {
			cout << setw(4) << matrix[i][j];
		}
		cout << "\n";
	}

Ну а чтобы вывести только один какой-то столбец, нужно убрать один из циклов и использовать всегда один номер столбца.
Вывод первого столбца:

	int col = 0;
	for (int i = 0; i < 5; ++i) {
	    cout << setw(4) << matrix[i][col];
	}
	cout << "\n";

Для заполнения нулями соответственно надо просто присваивать туда 0 вместо вывода.

Добрый день Alex P. )))
Спасибо, но я только не поняла, а куда мене это вставить

int col = 0;
	for (int i = 0; i < 5; ++i) {
	    cout << setw(4) << matrix[i][col];
	}
	cout << "\n";

Код получается выглядит так

#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	system("chcp 1251 > nul");

	vector<int> parent(5, -1); // объявили и сразу заполнили -1-цами в кол-ве 5 штук
	int big_num(10000);
	int matrix[5][5] = { {0,5,12,0,0},
	{5,0,4,0,1},
	{12,4,0,2,0},
	{0,0,2,0,5},
	{0,1,0,5,0} };

	int pos[5], node[5], min(0), index_min(0);
	for (int i = 0; i < 5; ++i) {
		pos[i] = big_num;
		node[i] = 0;
	}
	for (int j = 0; j < 5; ++j) {		
		for (int i = 0; i < 5; ++i) {
			cout << setw(4) << matrix[i][j];
		}
		cout << "\n";
	}
	int x;

	cout << "Введите x1";

		cin >> x;
	pos[x - 1] = 0; // начальная точка 
	cout << "\n";
	for (int i = 0; i < 4; ++i) {
		min = big_num;
		for (int j = 0; j < 5; ++j) {
			if (!node[j] && pos[j] < min) {
				min = pos[j];
				index_min = j;
			}
		}
		node[index_min] = true;
		for (int j = 0; j < 5; ++j) {
			if (!node[j] && matrix[index_min][j] > 0 && pos[index_min] != big_num && pos[index_min] + matrix[index_min][j] < pos[j]) {
				pos[j] = pos[index_min] + matrix[index_min][j];
				parent.at(j) = index_min; // запоминаем предка вершины j
			}
		}
	}
	int n(0);
	cout << "\nКоличество вершин? : ";
	cin >> n;

	vector<int>temp; // n - 1, так как не забываем про индексацию
	for (int i = n - 1; i != -1; i = parent.at(i))temp.push_back(i + 1); // а все что здесь делается описано в справке,которую я те кинул
	reverse(temp.begin(), temp.end());
	for (int i = 0; i < temp.size(); ++i)cout << temp.at(i) << " ";

	cout << "\nWeight : " << pos[n - 1] << "\n";

	cout << endl;
	return 0;
}

Ну это только само заполнение нулями столбца с номером col. Еще надо как минимум добавить ввод номеров удаляемых вершин и т.д.

Точнее это его вывод, а не удаление. :arrow_down:


Так это ж легко исправить, полно учебников даже бесплатно и онлайн
https://metanit.com/cpp/tutorial/
https://ravesli.com/uroki-cpp/#toc-0