Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include "stdafx.h"
- #include <iostream>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- using namespace std;
- #define word unsigned int
- int i, j, n, p, xn, xk;
- int flag[11];
- word c[11][11], l[11];
- char s[80], path[80][11];
- int min(int n)
- {
- int i, result;
- for (i = 0; i<n; i++)
- if (!(flag[i])) result = i;
- for (i = 0; i<n; i++)
- if ((l[result]>l[i]) && (!flag[i])) result = i;
- return result;
- }
- word minim(word x, word y)
- {
- if (x<y) return x;
- return y;
- }
- void main()
- {
- system("chcp 1251");
- system("pause");
- cout << "Введите кол-во точек: ";
- cin >> n;
- for (i = 0; i<n; i++)
- for (j = 0; j<n; j++) c[i][j] = 0;
- for (i = 0; i<n; i++)
- for (j = i + 1; j<n; j++)
- {
- cout << "Введите расстояние от " << i + 1 << " до " << j + 1 << ": ";
- cin >> c[i][j];
- }
- cout << endl << endl;
- for (i = 0; i<n; i++)
- {
- for (j = 0; j<n; j++)
- {
- printf("%6d", c[i][j]);
- c[j][i] = c[i][j];
- }
- printf("\n\n");
- }
- for (i = 0; i<n; i++)
- for (j = 0; j<n; j++)
- if (c[i][j] == 0) c[i][j] = UINT32_MAX; //бесконечность
- cout << "Введите начальную точку: ";
- cin >> xn;
- cout << "Введите конечную точку: ";
- cin >> xk;
- xk--;
- xn--;
- if (xn == xk)
- {
- cout << "Начальная и конечная точки совпадают" << endl;
- _getch();
- return;
- }
- for (i = 0; i<n; i++)
- {
- flag[i] = 0;
- l[i] = UINT32_MAX;
- }
- l[xn] = 0;
- flag[xn] = 1;
- p = xn;
- _itoa_s(xn + 1, s, 10);
- for (i = 1; i <= n; i++)
- {
- strcpy_s(path[i], "");
- strcat_s(path[i], s);
- }
- do
- {
- for (i = 0; i<n; i++)
- if ((c[p][i] != UINT32_MAX) && (!flag[i]) && (i != p))
- {
- if (l[i]>l[p] + c[p][i])
- {
- _itoa_s(i + 1, s, 10);
- strcpy_s(path[i + 1], path[p + 1]);
- strcat_s(path[i + 1], " ");
- strcat_s(path[i + 1], s);
- }
- l[i] = minim(l[i], l[p] + c[p][i]);
- }
- p = min(n);
- flag[p] = 1;
- }
- while (p != xk);
- if (l[p] != UINT32_MAX)
- {
- cout << "Путь: " << path[p + 1] << endl;
- cout << "Длина пути: " << l[p] << endl;
- }
- else
- cout << "Такого пути не существует" << endl;
- _getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment