ParanoidPanda

Untitled

Nov 10th, 2015
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.27 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int **graph;
  5. struct DOT{
  6. int begin;
  7. int end;
  8. int weight;
  9. };
  10. int dots; // кол-во вершин
  11. int edges; // кол-во ребер
  12. int minsaksess = INT_MAX; // минимальный самый
  13. int *minsakksess; // путь сохраненный
  14. DOT* dotes;
  15.  
  16. void DoTravel(int nextstep, int min, int *path, bool *flags, int it);
  17.  
  18. int main(){
  19. FILE *input = fopen("graph.txt", "r+");
  20. if (input == NULL){
  21. printf("CANNOT OPEN THIS \n");
  22. }
  23. else{
  24. fscanf(input, "%d%d", &dots, &edges);
  25. dotes = (DOT *)malloc(edges * 2 * sizeof(DOT)); // массив структур
  26. minsakksess = (int *)malloc(dots *sizeof(int));
  27. graph = (int **)malloc(dots*sizeof(int));
  28. for (int i = 0; i < dots; i++)
  29. graph[i] = (int *)malloc(edges*sizeof(int));
  30. for (int i = 0; i < dots; i++){
  31. for(int j = 0; j < edges; j++){
  32. fscanf(input, "%d", &graph[i][j]);
  33. }
  34. }
  35. fclose(input);
  36. int step = 0;
  37. for (int i = 0; i < dots; i++){
  38. for (int j = 0; j < edges; j++){
  39. if (graph[i][j]>0){
  40. for (int o = i + 1; o < dots; o++){
  41. if (graph[o][j] == graph[i][j]){
  42. dotes[step].begin = i;
  43. dotes[step].end = o;
  44. dotes[step].weight = graph[i][j];
  45. step++;
  46. dotes[step].begin = o;
  47. dotes[step].end = i;
  48. dotes[step].weight = graph[i][j];
  49. step++;
  50. }
  51. }
  52. }
  53. }
  54. }
  55. printf("Edges: %d \n", step);
  56. for (int i = 0; i < edges * 2; i++){
  57. printf("Edge [%d]: \t begin: %d end: %d weight %d \n", i + 1, dotes[i].begin + 1, dotes[i].end + 1, dotes[i].weight);
  58. }
  59. int *path = (int *)malloc(dots*sizeof(int));
  60. bool *flags = (bool *)malloc(dots*sizeof(bool));
  61. for (int i = 0; i < dots; i++){
  62. path[i] = 0;
  63. flags[i] = false;
  64. }
  65. DoTravel(0, 0, path, flags, 0);
  66.  
  67. //сохраняем в graphviz
  68.  
  69. FILE *output = fopen("GRAPH.dot", "w+");
  70. fprintf(output, "digraph {\n");
  71. for (int i = 0; i < dots; i++)
  72. fprintf(output, " %d;\n", i+1);
  73. step = 0;
  74. for (int i = 0; i < dots - 1; i++){
  75. for (int j = 0; j < edges * 2; j++){
  76. if (minsakksess[i] == dotes[j].begin && minsakksess[i + 1] == dotes[j].end){
  77. fprintf(output, " %d -> %d [ label = \"%d\" ]\n", minsakksess[i] + 1, minsakksess[i + 1] + 1,dotes[j].weight);
  78. }
  79. }
  80. }
  81. fprintf(output, "}");
  82. fclose(output);
  83. free(dotes);
  84. free(path);
  85. free(flags);
  86. free(graph);
  87. }
  88. return 0;
  89. }
  90.  
  91. void DoTravel(int nextstep, int min, int *path, bool *flags, int it){
  92. int count = 0;
  93. path[it] = nextstep;
  94. flags[nextstep] = true;
  95. for (int i = 0; i < dots; i++){
  96. if (flags[i] == true)
  97. count++;
  98. }
  99. if (count == dots){
  100. if (min < minsaksess){
  101. minsaksess = min;
  102. for (int i = 0; i < dots; i++){
  103. minsakksess[i] = path[i];
  104. printf("%d -> ", path[i]+1);
  105. }
  106. printf("%d \n", min);
  107. }
  108. }
  109. else{
  110. for (int i = 0; i < edges * 2; i++){
  111. if (dotes[i].begin == nextstep && flags[dotes[i].end] != true){
  112. int *_path = (int *)malloc(dots*sizeof(int));
  113. bool *_flags = (bool *)malloc(dots*sizeof(bool));
  114. for (int i = 0; i < dots; i++){
  115. _path[i] = path[i];
  116. _flags[i] = flags[i];
  117. }
  118. DoTravel(dotes[i].end, min + dotes[i].weight, _path, _flags, it + 1);
  119. free(_flags);
  120. free(_path);
  121. }
  122. }
  123. }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment