Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.77 KB | None | 0 0
  1. /*Задание 24. Алгоритм Дейкстры*/
  2. // (づ°ω°)づミe★゜・。。・゜゜・。。・゜☆゜・。。・゜゜・。。・゜
  3. #define _CRT_SECURE_NO_WARNINGS 1
  4. #define INF INT_MAX
  5. #define MAX_NODES 5000
  6.  
  7. #include <stdio.h>
  8. #include <limits.h>
  9. #include <stdlib.h>
  10. #include <stdbool.h>
  11.  
  12. /* задает границы ожидаемого на ввод числа */
  13. int ranged_input(int low_limit, int upper_limit, char *error_msg)
  14. {
  15.     int temp = 0;
  16.  
  17.     scanf("%d", &temp);
  18.  
  19.     if  ((temp < low_limit) || (upper_limit < temp))
  20.     {
  21.         puts(error_msg);
  22.  
  23.         exit(0);
  24.     }
  25.  
  26.     return temp;
  27. }
  28.  
  29. /* Dijkstra algo
  30.  * param N: число вершин в графе
  31.  * param S: ~start, начало пути
  32.  * param F: ~final, конец пути
  33.  * param M: колличество ребер в графе
  34.  */
  35. void dijkstra(int N, int S, int F, int M)
  36. {}
  37.  
  38. int main(void) {
  39.    
  40.     freopen("Тест1.txt", "r", stdin);
  41.  
  42.     int N = ranged_input(0, MAX_NODES, "bad number of vertices\n");
  43.     int S = ranged_input(1, N, "bad vertex\n"); S--;    // мне удобнее считать вершины от нуля
  44.     int F = ranged_input(1, N, "bad vertex\n"); F--;    // мне удобнее считать вершины от нуля
  45.     int M = ranged_input(0, N * (N + 1) / 2, "bad number of edges\n");
  46.  
  47.     // граф g хранится в виде матрицы смежности:
  48.     // для каждой вершины v строка g[v] содержит длины рёбер, исходящих из этой вершины
  49.     int **g = (int**)malloc(N * sizeof(int*));
  50.     for (int i = 0; i < N; i++)
  51.     {
  52.         g[i] = (int*)malloc(N * sizeof(int));
  53.    
  54.         for (int j = 0; j < N; ++j)
  55.             g[i][j] = INF;
  56.     }
  57.        
  58.     // 5000 * (1 + 4 + 4) = 45000 Бт ~ 45 Кб
  59.     bool used[MAX_NODES] = { false };       // пройденые вершины
  60.     int from_start[MAX_NODES] = { INF };    // от начальной вершины
  61.     int parent[MAX_NODES];                  // предки вершин
  62.  
  63.     for (int i = 0; i < N; i++)
  64.         from_start[i] = (i == S) ? (0) : (INF);
  65.  
  66.     // заполнение матрицы смежности
  67.     for (int i = 0; i < M; ++i)
  68.     {
  69.         int edge_from = ranged_input(1, N, "bad vertex\n") - 1; // мне удобнее считать вершины от нуля
  70.         int edge_to = ranged_input(1, N, "bad vertex\n") - 1;
  71.         int edge_len = ranged_input(0, INT_MAX, "bad length\n");
  72.  
  73.         g[edge_from][edge_to] = edge_len;
  74.         g[edge_to][edge_from] = edge_len;
  75.     }
  76.  
  77.     // вывод матрицы смежности
  78.     //{
  79.     //  for (int i = 0; i < N; ++i)
  80.     //  {
  81.     //      for (int j = 0; j < N; ++j)
  82.     //          printf("(%d)%10d", j, g[i][j]);
  83.     //      printf("\n");
  84.     //  }
  85.     //}
  86.  
  87.    
  88.  
  89.  
  90.  
  91.     for (int i = 0; i < N; i++)     // ~матрица смежности
  92.         free(g[i]);
  93.     free(g);
  94.  
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement