ParanoidPanda

Untitled

Nov 16th, 2015
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.37 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. if (edges <= 0 || dots <= 0){
  26. printf("Uncorrect number of edges/dots\n");
  27. exit(0);
  28. }
  29. dotes = (DOT *)malloc(edges * 2 * sizeof(DOT)); // массив структур
  30. minsakksess = (int *)malloc(dots *sizeof(int));
  31. graph = (int **)malloc(dots*sizeof(int));
  32. for (int i = 0; i < dots; i++)
  33. graph[i] = (int *)malloc(edges*sizeof(int));
  34. for (int i = 0; i < dots; i++){
  35. for(int j = 0; j < edges; j++){
  36. fscanf(input, "%d", &graph[i][j]);
  37. }
  38. }
  39. fclose(input);
  40. int step = 0;
  41. for (int i = 0; i < dots; i++){
  42. for (int j = 0; j < edges; j++){
  43. if (graph[i][j]>0){
  44. for (int o = i + 1; o < dots; o++){
  45. if (graph[o][j] == graph[i][j]){
  46. dotes[step].begin = i;
  47. dotes[step].end = o;
  48. dotes[step].weight = graph[i][j];
  49. step++;
  50. dotes[step].begin = o;
  51. dotes[step].end = i;
  52. dotes[step].weight = graph[i][j];
  53. step++;
  54. }
  55. }
  56. }
  57. }
  58. }
  59. printf("Edges: %d \n", step);
  60. for (int i = 0; i < edges * 2; i++){
  61. printf("Edge [%d]: \t begin: %d end: %d weight %d \n", i + 1, dotes[i].begin + 1, dotes[i].end + 1, dotes[i].weight);
  62. }
  63. int *path = (int *)malloc(dots*sizeof(int));
  64. bool *flags = (bool *)malloc(dots*sizeof(bool));
  65. for (int i = 0; i < dots; i++){
  66. path[i] = 0;
  67. flags[i] = false;
  68. }
  69. DoTravel(0, 0, path, flags, 0);
  70.  
  71. //сохраняем в graphviz
  72.  
  73. FILE *output = fopen("GRAPH.dot", "w+");
  74. fprintf(output, "digraph {\n");
  75. for (int i = 0; i < dots; i++)
  76. fprintf(output, " %d;\n", i+1);
  77. step = 0;
  78. for (int i = 0; i < dots - 1; i++){
  79. for (int j = 0; j < edges * 2; j++){
  80. if (minsakksess[i] == dotes[j].begin && minsakksess[i + 1] == dotes[j].end){
  81. fprintf(output, " %d -> %d [ label = \"%d\" ]\n", minsakksess[i] + 1, minsakksess[i + 1] + 1,dotes[j].weight);
  82. }
  83. }
  84. }
  85. fprintf(output, "}");
  86. fclose(output);
  87. free(dotes);
  88. free(path);
  89. free(flags);
  90. free(graph);
  91. }
  92. return 0;
  93. }
  94.  
  95. void DoTravel(int nextstep, int min, int *path, bool *flags, int it){
  96. int count = 0;
  97. path[it] = nextstep;
  98. flags[nextstep] = true;
  99. for (int i = 0; i < dots; i++){
  100. if (flags[i] == true)
  101. count++;
  102. }
  103. if (count == dots){
  104. if (min < minsaksess){
  105. minsaksess = min;
  106. for (int i = 0; i < dots; i++){
  107. minsakksess[i] = path[i];
  108. printf("%d -> ", path[i]+1);
  109. }
  110. printf("%d \n", min);
  111. }
  112. }
  113. else{
  114. for (int i = 0; i < edges * 2; i++){
  115. if (dotes[i].begin == nextstep && flags[dotes[i].end] != true){
  116. int *_path = (int *)malloc(dots*sizeof(int));
  117. bool *_flags = (bool *)malloc(dots*sizeof(bool));
  118. for (int i = 0; i < dots; i++){
  119. _path[i] = path[i];
  120. _flags[i] = flags[i];
  121. }
  122. DoTravel(dotes[i].end, min + dotes[i].weight, _path, _flags, it + 1);
  123. free(_flags);
  124. free(_path);
  125. }
  126. }
  127. }
  128. }
Advertisement
Add Comment
Please, Sign In to add comment