ParanoidPanda

Untitled

Nov 18th, 2015
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int *flag, *path, *minpath, **graph, **matrix;
  5. int min = 0;
  6.  
  7. int **loadthis(int **arr, int dts); // функция загрузки графа
  8. void travel(int num_s, int num_d, int lenght, int dts); //функция перебора
  9. int **makematrix(int *arr1, int **arr2, int dts);
  10. void savetofile(int **arr, int dts);
  11.  
  12.  
  13. int main(void){
  14. int dots = 5; //количество точек в графе
  15. //выделение динамической памяти под наши нужды
  16. flag = (int *)malloc(dots*sizeof(int));
  17. path = (int *)malloc(dots*sizeof(int));
  18. minpath = (int *)malloc(dots*sizeof(int));
  19. graph = (int **)malloc(dots * sizeof(int *));
  20. matrix = (int **)malloc(dots * sizeof(int *));
  21. for (int i = 0; i < dots; i++){
  22. graph[i] = (int *)malloc(dots * sizeof(int));
  23. matrix[i] = (int *)malloc(dots * sizeof(int));
  24. }
  25.  
  26. loadthis(graph,dots);
  27.  
  28. travel(0, 0, 0, dots);
  29.  
  30. makematrix(minpath, matrix, dots);
  31.  
  32. savetofile(matrix,dots);
  33.  
  34. //высвобождение динамической памяти
  35. free(graph);
  36. free(matrix);
  37. free(path);
  38. free(minpath);
  39. free(flag);
  40. return 0;
  41. }
  42.  
  43. int **loadthis(int **arr,int dts){
  44. FILE *file = fopen("graph.txt", "r");
  45. if (file == NULL){
  46. printf("Cannot open this file!\n");
  47. exit(0);
  48. }
  49. for (int i = 0; i < dts; i++){
  50. for (int j = 0; j < dts; j++){
  51. fscanf(file, "%d", &arr[i][j]);
  52. }
  53. }
  54. fclose(file);
  55. return arr;
  56. }
  57.  
  58. void travel(int num_s, int num_d, int lenght,int dts){
  59. if (num_s == dts){
  60. if (min == 0 || lenght < min){
  61. min = lenght;
  62. for (int i = 0; i < dts; i++){
  63. minpath[i] = path[i];
  64. }
  65. return;
  66. }
  67. }
  68. if (flag[num_d] == 1)
  69. return;
  70. path[num_s] = num_d;
  71. flag[num_d] = 1;
  72. for (int i = 0; i < dts; i++){
  73. if (graph[num_d][i] == 0)
  74. continue;
  75. travel(num_s + 1, i, lenght + graph[num_d][i],dts);
  76. }
  77. flag[num_d] = 0;
  78. }
  79.  
  80. int **makematrix(int *arr1, int **arr2, int dts){
  81. int tmp = 0, ttmp = 0;
  82.  
  83. for (int i = 0; i < dts; i++){
  84. for (int j = 0; j < dts; j++){
  85. arr2[i][j] = 0;
  86. }
  87. }
  88.  
  89. for (int i = 0; i < dts-1; i++){
  90. tmp = arr1[i];
  91. ttmp = arr1[i + 1];
  92. arr2[tmp][ttmp] = 1;
  93. }
  94. //костыль
  95. if (graph[ttmp][0] != 0)
  96. arr2[ttmp][0] = 1;
  97. return arr2;
  98. }
  99.  
  100. void savetofile(int **arr,int dts){
  101. FILE *file = fopen("result.txt", "w + ");
  102. fprintf(file, "digraph {\n");
  103. for (int i = 0; i < dts; i++){
  104. fprintf(file, " %d;\n", i + 1);
  105. }
  106. for (int i = 0; i < dts; i++){
  107. for (int j = 0; j < dts; j++){
  108. if (arr[i][j]>0){
  109. fprintf(file, " %d -> %d [ label = \"%d\" ];\n", i + 1, j + 1, graph[i][j]);
  110. }
  111. }
  112. }
  113. fprintf(file,"}");
  114. fclose(file);
  115. }
Advertisement
Add Comment
Please, Sign In to add comment