ParanoidPanda

Untitled

Dec 27th, 2015
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.01 KB | None | 0 0
  1. #include "functions.h"
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. int **graph;
  7.  
  8. struct DOT{
  9. int begin;
  10. int end;
  11. int weight;
  12. };
  13.  
  14. int dots = 0; // кол-во вершин
  15. int edges = 0; // кол-во ребер
  16. int minsaksess = INT_MAX; // минимальный самый
  17. int *minsakksess; // путь сохраненный
  18. DOT* dotes;
  19. int buff_b = 0, buff_end = 0, buff_w = 0;
  20.  
  21. void DoTravel(int nextstep, int min, int *path, bool *flags, int it){
  22. int count = 0;
  23. path[it] = nextstep;
  24. flags[nextstep] = true;
  25. for (int i = 0; i < dots; i++){
  26. if (flags[i] == true)
  27. count++;
  28. }
  29. if (count == dots){
  30. //min += graph[path[count - 1]][0];
  31. bool hook = false;
  32. for (int i = 0; i < edges; i++){
  33. if (dotes[i].begin == path[dots - 1] && dotes[i].end == 0){
  34. min += dotes[i].weight;
  35. hook = true;
  36. }
  37. }
  38. if (min < minsaksess && hook == true){
  39. minsaksess = min;
  40. for (int i = 0; i < dots; i++){
  41. minsakksess[i] = path[i];
  42. }
  43. }
  44. }
  45. else{
  46. for (int i = 0; i < edges; i++){
  47. if (dotes[i].begin == nextstep && flags[dotes[i].end] != true){
  48. int *_path = (int *)malloc(dots*sizeof(int));
  49. bool *_flags = (bool *)malloc(dots*sizeof(bool));
  50. for (int i = 0; i < dots; i++){
  51. _path[i] = path[i];
  52. _flags[i] = flags[i];
  53. }
  54. DoTravel(dotes[i].end, min + dotes[i].weight, _path, _flags, it + 1);
  55. free(_flags);
  56. free(_path);
  57. }
  58. }
  59. }
  60. }
  61.  
  62. void mainmenu(){
  63. printf("Choose\n");
  64. printf("Show graph [1] \n");
  65. printf("Start algo [2] \n");
  66. printf("Delete vertex [3] \n");
  67. printf("Delete edge [4] \n");
  68. printf("Add edge [5] \n");
  69. int choose = 0;
  70. scanf("%d", &choose);
  71. switch (choose){
  72. case(1) : {
  73. showgraph();
  74. mainmenu();
  75. break;
  76. }
  77. case(2) : {
  78. startalgo();
  79. mainmenu();
  80. break;
  81. }
  82. case(3) : {
  83. deletever();
  84. mainmenu();
  85. break;
  86.  
  87. }
  88. case(4) : {
  89. deleteedge();
  90. mainmenu();
  91. break;
  92. }
  93. case(5) : {
  94. addedge();
  95. mainmenu();
  96. break;
  97. }
  98. default:{
  99. printf("Bad choose! \n\n");
  100. mainmenu();
  101. }
  102. }
  103. }
  104.  
  105. void startalgo(){
  106. minsakksess = (int *)malloc(dots *sizeof(int));
  107. int *path = (int *)malloc(dots*sizeof(int));
  108. bool *flags = (bool *)malloc(dots*sizeof(bool));
  109. for (int i = 0; i < dots; i++){
  110. path[i] = 0;
  111. flags[i] = false;
  112. }
  113. DoTravel(0, 0, path, flags, 0);
  114.  
  115. //сохраняем в graphviz
  116. printf("\n");
  117. for (int i = 0; i < dots; i++){
  118. printf("%d->", minsakksess[i]);
  119. }
  120. printf("0");
  121. printf(" weight: %d", minsaksess);
  122. printf("\n");
  123.  
  124. FILE *output = fopen("GRAPH.dot", "w");
  125. fprintf(output, "diagraph {\n");
  126. for (int iw = 0; iw < dots + 5; iw++){
  127. for (int jw = 0; jw < edges; jw++){
  128. if (((dotes[jw].begin == minsakksess[iw]) && (dotes[jw].end == minsakksess[iw + 1])) || ((dotes[jw].end == minsakksess[iw]) && (dotes[jw].begin == minsakksess[iw + 1])))
  129. fprintf(output, " %d -> %d [ label = \"%d\" ];\n", minsakksess[iw], minsakksess[iw + 1], dotes[jw].weight);
  130. }
  131. }
  132. for (int i = 0; i < edges; i++){
  133. if (dotes[i].begin == minsakksess[dots - 1] && dotes[i].end == 0){
  134. fprintf(output, " %d -> %d [ label = \"%d\" ];\n", dotes[i].begin, 0, dotes[i].weight);
  135. }
  136. }
  137.  
  138. fprintf(output, "}");
  139. fclose(output);
  140. }
  141.  
  142. void showgraph(){
  143. for (int i = 0; i < edges; i++){
  144. printf("Edge [%d]: \t begin: %d end: %d weight %d \n", i, dotes[i].begin, dotes[i].end, dotes[i].weight);
  145. }
  146. }
  147.  
  148. void deleteedge(){
  149. int edg = 0;
  150. printf("Input number of edge : ");
  151. scanf("%d", &edg);
  152. if (edg < 0 && edg >= edges)
  153. printf("BAD!!!\n");
  154. else{
  155. for (int i = edg; i < edges - 1; i++){
  156. dotes[i].begin = dotes[i + 1].begin;
  157. dotes[i].end = dotes[i + 1].end;
  158. dotes[i].weight = dotes[i + 1].weight;
  159. }
  160. dotes = (DOT *)realloc((void *)dotes, (edges = edges - 1)*sizeof(DOT));
  161. }
  162. }
  163.  
  164. void deletever(){
  165. int ver = 0;
  166. printf("Input number of edge : ");
  167. scanf("%d", &ver);
  168. if (ver < 0 && ver >= dots)
  169. printf("BAD!!!\n");
  170. else{
  171. for (int i = 0; i < edges; i++){
  172. for (int s = 0; s < edges; s++){
  173. if (dotes[i].begin == ver || dotes[i].end == ver){
  174. for (int j = i; j < edges - 1; j++){
  175. dotes[j].begin = dotes[j + 1].begin;
  176. dotes[j].end = dotes[j + 1].end;
  177. dotes[j].weight = dotes[j + 1].weight;
  178. }
  179. dotes = (DOT *)realloc((void *)dotes, (edges = edges - 1)*sizeof(DOT));
  180. }
  181. }
  182. }
  183. for (int p = 0; p < edges; p++){
  184. if (dotes[p].begin>ver)
  185. dotes[p].begin -= 1;
  186. if (dotes[p].end > ver)
  187. dotes[p].end -= 1;
  188. }
  189. dots = dots - 1;
  190. }
  191. }
  192.  
  193. void addedge(){
  194. int tempb = 0;
  195. int tempe = 0;
  196. int tempw = 0;
  197. printf("Input BEGIN and END and WEIGHT: ");
  198. scanf("%d %d %d", &tempb, &tempe, &tempw);
  199. if ((tempb < 0 && tempb >= dots) || (tempe < 0 && tempe >= dots) || tempb == tempe)
  200. {
  201. printf("BAD\n");
  202. mainmenu();
  203. }
  204. else{
  205. bool target = false;
  206. for (int i = 0; i < edges; i++){
  207. if (tempb == dotes[i].begin && tempe == dotes[i].end)
  208. target = true;
  209. }
  210. if (target == true){
  211. printf("BAD\n");
  212. mainmenu();
  213. }
  214. else{
  215. dotes = (DOT *)realloc((void *)dotes, (edges = edges + 1)*sizeof(DOT));
  216. dotes[edges - 1].begin = tempb;
  217. dotes[edges - 1].end = tempe;
  218. dotes[edges - 1].weight = tempw;
  219. }
  220. }
  221. }
  222.  
  223. int parse_string(char *s) {
  224. int i = 0;
  225. int j;
  226. while (s[i] >= '0' && s[i] <= '9')
  227. ++i;
  228. if (i == 0 || s[i] == '\0')
  229. return 0;
  230. char *buffer = (char*)malloc(i + 1);
  231. for (j = 0; j < i; j++)
  232. buffer[j] = s[j];
  233. buffer[i] = '\0';
  234. buff_b = atoi(buffer);
  235. free(buffer);
  236.  
  237. while ((s[i] < '0' || s[i] > '9') && s[i] != '\0')
  238. ++i;
  239. if (s[i] == '\0')
  240. return 0;
  241. int snd_begin = i;
  242. while (s[i] >= '0' && s[i] <= '9')
  243. ++i;
  244. if (s[i] == '\0')
  245. return 0;
  246. buffer = (char*)malloc(i - snd_begin + 1);
  247. for (j = snd_begin; j < i; j++)
  248. buffer[j - snd_begin] = s[j];
  249. buffer[i - snd_begin] = '\0';
  250. buff_end = atoi(buffer);
  251. free(buffer);
  252.  
  253. while ((s[i] < '0' || s[i] > '9') && s[i] != '\0')
  254. ++i;
  255. if (s[i] == '\0')
  256. return 0;
  257. snd_begin = i;
  258. while (s[i] >= '0' && s[i] <= '9')
  259. ++i;
  260. if (s[i] == '\0')
  261. return 0;
  262. buffer = (char*)malloc(i - snd_begin + 1);
  263. for (j = snd_begin; j < i; j++)
  264. buffer[j - snd_begin] = s[j];
  265. buffer[i - snd_begin] = '\0';
  266. buff_w = atoi(buffer);
  267. free(buffer);
  268. return 1;
  269. }
  270.  
  271. void loadit(){
  272. FILE *input = fopen("graph.txt", "r+");
  273. if (input == NULL){
  274. printf("CANNOT OPEN THIS \n");
  275. }
  276. else{
  277. char s[1024];
  278. //dotes = (DOT *)malloc(edges * sizeof(DOT)); // массив структур
  279. dotes = (DOT *)realloc((void *)dotes, (edges)*sizeof(DOT));
  280. while (!feof(input)){
  281. fgets(s, 1024, input);
  282. if (parse_string(s)) {
  283. dotes = (DOT *)realloc((void *)dotes, (edges = edges + 1)*sizeof(DOT));
  284. dotes[edges - 1].begin = buff_b;
  285. dotes[edges - 1].end = buff_end;
  286. dotes[edges - 1].weight = buff_w;
  287. if (dotes[edges - 1].begin + 1 >= dots)
  288. dots = dotes[edges - 1].begin + 1;
  289. if (dotes[edges - 1].end + 1 >= dots)
  290. dots = dotes[edges - 1].end + 1;
  291. }
  292. }
  293. fclose(input);
  294. }
  295. }
Advertisement
Add Comment
Please, Sign In to add comment