Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #define INF 10000
- int find_min(int S[15], int D[15], int N);
- int main()
- {
- int i, j, tmp;
- int N = 15; //Количество вершин
- int matrix[15][15] = //Матрица смежности
- { {INF, 15, INF, INF, INF, INF, INF, INF, 10, 50, INF, INF, INF, INF, INF},
- {INF, INF, 20, 10, 30, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF},
- {INF, INF, INF, INF, INF, 40, INF, INF, INF, INF, INF, INF, INF, INF, INF},
- {INF, INF, INF, INF, 60, INF, INF, INF, 50, INF, INF, INF, INF, INF, INF},
- {INF, INF, INF, INF, INF, INF, 5, INF, INF, INF, INF, INF, INF, INF, INF},
- {INF, INF, INF, INF, INF, INF, 10, INF, INF, INF, INF, INF, INF, INF, INF},
- {INF, INF, INF, INF, INF, INF, INF, 10, INF, INF, INF, INF, INF, INF, INF},
- {INF, INF, INF, INF, INF, INF, INF, INF, INF, 25, 5, INF, INF, INF, INF},
- {INF, INF, INF, INF, INF, INF, INF, 15, INF, INF, INF, INF, INF, INF, INF},
- {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 15, INF, INF},
- {INF, INF, INF, INF, INF, INF, INF, INF, INF, 45, INF, INF, INF, INF, INF},
- {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 15, INF, INF, INF, INF},
- {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 35, INF, 30, INF},
- {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 40},
- {10, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF}};
- int nu, target;
- int S[15] = { 0 };
- int D[15] = { 0 };
- for (i = 0; i < N; i++)
- {
- printf("\t%d", i + 1);
- }
- printf("\n");
- for (i = 0; i < N; i++)
- {
- printf("%d\t", i + 1);
- for (j = 0; j < N; j++)
- {
- tmp = (matrix[i][j] == INF) ? 0 : matrix[i][j];
- printf("%d\t", tmp);
- }
- printf("\n");
- }
- printf("Dejkstra's algorithm:\n");
- printf("Enter start vertex nu: ");
- scanf("%d", &nu);
- printf("Enter target vertex: ");
- scanf("%d", &target);
- S[nu - 1] = 1; //Включаем вершину nu в S
- for (i = 0; i < N; i++)
- {
- if (i == nu - 1)
- {
- D[i] = 0;
- continue;
- }
- D[i] = matrix[0][i]; //TODO: посмотреть, какую строку записываем относительно nu
- }
- for (i = 0; i < N; i++)
- {
- tmp = find_min(S, D, N); //Очередная вершина
- if (tmp < 0) break; //TODO: проверить это
- S[i] = 1;
- for (j = 0; j < N; j++)
- {
- if (S[j] == 1) continue;
- D[j] = (D[j] < D[tmp] + matrix[tmp][j]) ? D[j] : D[tmp] + matrix[tmp][j];
- }
- }
- for (i = 0; i < N; i++)
- {
- printf("Shortest route from %d to %d is %d\n", nu, i + 1, D[i]);
- }
- return 0;
- }
- int find_min(int S[15], int D[15], int N)
- {
- int result = -1;
- int min = INF;
- int i;
- for (i = 0; i < N; i++)
- {
- if (S[i] == 1) continue;
- if (D[i] < min)
- {
- min = D[i];
- result = i;
- }
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement