По заданной системе односторонних дорог определить, есть ли город, куда можно попасть из любого другого - C (СИ)
Формулировка задачи:
Доброго времени суток!
Такая задача:
По заданной системе односторонних дорог определить, есть ли в ней город, куда можно попасть из любого другого города, проезжая не более 100 км. (Необходимо применить алгоритм флойда)
Никак не могу сделать программу и разобраться с алгоритмом Флойда.... и как указывать расстояние для ребер?
Буду благодарен за любую помощь в решении!
Решение задачи: «По заданной системе односторонних дорог определить, есть ли город, куда можно попасть из любого другого»
textual
Листинг программы
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "iostream"
#define NMAX 10
void vvod_grafa (int G [NMAX][NMAX], int n)
{
int i,j,km;
puts("\nРебра вводить по типу: '№' <Пробел> '№' <Пробел> <Тире> <Пробел> 'Расстояние'");
puts("\nНапример: 1 2 - 30");
printf ("Введите ребра:\n\n");
while (scanf_s("%d %d - %d",&i,&j,&km) == 3)
{
G[i][j]=km;
}
putchar ('\n');
}
void way( int G[NMAX][NMAX], int n, int D[NMAX][NMAX]) {
int i, j, k;
for (i = 0; i < n; i++)
for (j = 0;j < n; j++)
D[i][j] = 999;
for (i = 0; i < n; i++) {
for (j = 0;j < n; j++) {
if(G[i][j] != 0)
D[i][j] = G[i][j];
}
}
for (i = 0; i < n; i++) {
D[i][i] = 0;
}
for (k = 0; k < n; k++) {
for (i = 0; i < n; i++) {
if (D[i][k] != 999) {
for (j = 0; j < n; j++) {
if (D[i][k] + D[k][j] < D[i][j]) {
D[i][j] = D[i][k] + D[k][j];
}
}
}
}
}
}
void vivod_grafa ( int g1[NMAX][NMAX], int n)
{
putchar ('\n');
for (int i = 0; i < n; i++)
{
printf("\n");
for (int j = 0; j < n; j++)
{
printf("%4d", g1[i][j]);
}
}
putchar('\n');
}
void obrabotka(int D[NMAX][NMAX], int n)
{
int f = 1;
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n; i++)
{
if( D[i][j] != 999)
{
if (j!=i && D[i][j] > 100)
{
f = 0;
}
}
}
if (f == 1) printf("В город № %d можно попасть из любого другого города, проезжая не более 100 км \n", j);
f = 1;
}
if (f == 0) printf("Такого города нет в данной системе дорог.");
}
int main()
{
setlocale(LC_ALL,"Russian");
int G[NMAX][NMAX]={0};
int D[NMAX][NMAX] ;
int n ;
puts("\n***");
puts("\nДобро пожаловать!!!");
puts("\nДанная программа определяет наличие города, в которую можно попасть из любого друого города, проезжая при этом не более 100 км.");
puts("\n***");
putchar('\n');
puts("\nВведите количество городов:");
scanf_s("%d", &n);
vvod_grafa (G,n);
puts("\nМатрица смежности:");
vivod_grafa (G,n);
putchar('\n');
way(G, n, D);
puts("\nРасстояние между городами:");
vivod_grafa(D, n);
putchar('\n');
putchar('\n');
obrabotka(D, n);
printf ("\n\nДля завершения нажмите любую клавишу\n");
_getch();
return 0;
}
Объяснение кода листинга программы
- Ввод и вывод матрицы смежности:
- Ввод матрицы смежности осуществляется с помощью функции
vvod_grafa, которая принимает в качестве аргументов матрицу смежностиGи количество городовn. - Вывод матрицы смежности осуществляется с помощью функции
vivod_grafa, которая принимает в качестве аргументов матрицу смежностиg1и количество городовn.
- Ввод матрицы смежности осуществляется с помощью функции
- Поиск кратчайшего пути:
- Для поиска кратчайшего пути используется алгоритм Дейкстры, реализованный в функции
way. - Алгоритм Дейкстры работает следующим образом:
- Инициализация матрицы расстояний
Dзначением 999 для всех городов, кроме диагонали. - Начальное значение расстояния между текущим городом и всеми остальными городами устанавливается равным бесконечности, за исключением диагонали, для которой оно равно 0.
- На каждом шаге алгоритма, для каждого города
i, выбирается соседний городk, для которого значениеD[i][k]минимально. - Если
D[i][k]меньше текущего значенияD[i][j], то обновляется значениеD[i][j]. - Если
D[i][k]равно текущему значениюD[i][j], то перебираются все соседние городаjдля городаkи проверяется, является лиD[i][j]меньше текущего значенияD[i][k]. - Если условие выполняется, то обновляется значение
D[i][j]. - После завершения алгоритма, для каждого города выводится кратчайшее расстояние до него.
- Инициализация матрицы расстояний
- Для поиска кратчайшего пути используется алгоритм Дейкстры, реализованный в функции
- Проверка наличия города:
- Функция
obrabotkaпроверяет, есть ли в системе дорог город, в который можно попасть из любого другого города, проезжая не более 100 км. - Если такой город есть, выводится сообщение
В город № x можно попасть из любого другого города, проезжая не более 100 км, гдеx- номер города. - Если такого города нет, выводится сообщение
Такого города нет в данной системе дорог..
- Функция
- Ввод данных и вывод результатов:
- Количество городов вводится с помощью функции
scanf_s. - Ввод матрицы смежности и вывод результатов работы программы осуществляется с помощью функций
vvod_grafa,vivod_grafa,way,obrabotkaиprintf.
- Количество городов вводится с помощью функции