ParanoidPanda

Untitled

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