Advertisement
Merkava

Untitled

May 3rd, 2014
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.60 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. struct Arc
  5. {
  6. int from; //индекс исходящей вершины
  7. int to; //индекс входящей вершины
  8. double weight;
  9. } ;
  10. struct Way
  11. {
  12. bool exist; //существование пути
  13. double sumWeight; //суммарный вес
  14. int refPrev; //индекс узла, через который проходит путь
  15. };
  16. struct Graph
  17. {
  18. int numNodes; //число вершин
  19. int numArcs; //число дуг
  20. struct Arc *arcs; //указатель на массив дуг
  21.  
  22. struct Way *pMinWay; //Адрес первого элемента массива и инфрмацией о минималном пути от start до finish
  23. //pMinWay[i] минимальная стоимость из i в start
  24. };
  25.  
  26. void FindWay(struct Graph g, int, int);
  27.  
  28. int main(){
  29. FILE *edge;
  30. int i, edge_number;
  31. struct edge_struct *edge_items;
  32. struct edge_item *items;
  33. struct Graph *g;
  34. edge = fopen("edge.txt", "r");
  35. if (!edge)
  36. return 1;
  37. fscanf(edge, "%d", &edge_number);
  38. g = calloc(edge_number, sizeof(*g));
  39. for (i = 0; i < edge_number; ++i)
  40. fscanf(edge, "%d%d%d%d", &g[i].numNodes, &g[i].numArcs);
  41. fclose(edge);
  42. //ForStep(struct edge_struct *edge_items, struct edge_item *items, int edge_number);
  43. free(edge_items);
  44. return 0;
  45. }
  46.  
  47. // Шаг по дуге ixArc к вершине, смежной с вершиной transit
  48. void ForStep(struct Graph g, int ixArc)
  49. {
  50. int transit = g.arcs[ ixArc ].from; // Транзитная вершина
  51. int step = g.arcs[ ixArc ].to; // Смежная вершина
  52. int finish = g.arcs[ ixArc ].from; // Транзитная вершина ////////////
  53.  
  54. // Вычисляем новый суммарный вес пути через transit до step
  55. double newSumWeight = g.pMinWay[ transit ].sumWeight + g.arcs[ ixArc ].weight;
  56.  
  57. if( !g.pMinWay[ step ].exist )
  58. {
  59. // Эта вершина раскрыта впервые
  60. g.pMinWay[ step ].exist = true;
  61.  
  62. g.pMinWay[ step ].sumWeight = newSumWeight;
  63.  
  64. g.pMinWay[ step ].refPrev = transit;
  65. FindWay( g, step, finish );
  66. }
  67. else
  68. {
  69. // Эта вершина раньше встречалась
  70. if( g.pMinWay[ step ].sumWeight > newSumWeight )
  71. {
  72. // Новый путь короче
  73. g.pMinWay[ step ].sumWeight = newSumWeight;
  74. g.pMinWay[ step].refPrev = transit;
  75. FindWay( g, step, finish ); //////////////////////////
  76. }
  77. // Здесь: прежний путь лучше, то есть дальше искать
  78. // нечего, поэтому игнорируем этот шаг
  79. }
  80. }
  81.  
  82. // Поиск кратчайшего пути от transit до finish
  83. void FindWay(struct Graph g, int transit, int finish )
  84. {
  85. int ixArc;
  86. if( transit == finish ) return;
  87.  
  88. // Находим дуги, исходящие из transit и
  89. // выполняем шаг по каждой найденной дуге
  90. for( ixArc=0; ixArc < g.numArcs; ixArc++ )
  91. {
  92. // Рассматриваем случай орграфа, поэтому анализируем
  93. // только исходящую вершину дуги
  94. if( g.arcs[ ixArc ].from == transit )
  95. ForStep( g, ixArc );
  96. }
  97. return; // Больше путей нет
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement