ParanoidPanda

Untitled

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