ParanoidPanda

govno.c

Jan 8th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.76 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. minimal_path = (int *)malloc(dots *sizeof(int));
  99. int *path = (int *)malloc(dots*sizeof(int));
  100. int *flags = (int *)malloc(dots*sizeof(int));
  101. for (int i = 0; i < dots; i++){
  102. path[i] = 0;
  103. flags[i] = 0;
  104. }
  105. DoTravel(0, 0, path, flags, 0);
  106.  
  107. //сохраняем в graphviz
  108. printf("\n");
  109. for (int i = 0; i < dots; i++){
  110. printf("%d->", minimal_path[i]);
  111. }
  112. printf("0");
  113. printf(" weight: %d", minimal);
  114. printf("\n");
  115.  
  116. FILE *output = fopen("GRAPH.dot", "w");
  117. fprintf(output, "diagraph {\n");
  118. for (int iw = 0; iw < dots; iw++){
  119. for (int jw = 0; jw < edges; jw++){
  120. if ((dotes[jw].begin == minimal_path[iw]) && (dotes[jw].end == minimal_path[iw + 1]))
  121. fprintf(output, " %d -> %d [ label = \"%d\" ];\n", minimal_path[iw], minimal_path[iw + 1], dotes[jw].weight);
  122. }
  123. }
  124. for (int i = 0; i < edges; i++){
  125. if (dotes[i].begin == minimal_path[dots - 1] && dotes[i].end == 0){
  126. fprintf(output, " %d -> %d [ label = \"%d\" ];\n", dotes[i].begin, 0, dotes[i].weight);
  127. }
  128. }
  129.  
  130. fprintf(output, "}");
  131. fclose(output);
  132. }
  133.  
  134. void showgraph(){
  135. for (int i = 0; i < edges; i++){
  136. printf("Edge [%d]: \t begin: %d end: %d weight %d \n", i, dotes[i].begin, dotes[i].end, dotes[i].weight);
  137. }
  138. }
  139.  
  140. void deleteedge(){
  141. int edg = 0;
  142. printf("Input number of edge : ");
  143. scanf("%d", &edg);
  144. if (edg < 0 && edg >= edges)
  145. printf("BAD!!!\n");
  146. else{
  147. for (int i = edg; i < edges - 1; i++){
  148. dotes[i].begin = dotes[i + 1].begin;
  149. dotes[i].end = dotes[i + 1].end;
  150. dotes[i].weight = dotes[i + 1].weight;
  151. }
  152. dotes = (struct DOT *)realloc((void *)dotes, (edges = edges - 1)*sizeof(struct DOT));
  153. }
  154. }
  155.  
  156. void deletever(){
  157. int ver = 0;
  158. printf("Input number of edge : ");
  159. scanf("%d", &ver);
  160. if (ver < 0 && ver >= dots)
  161. printf("BAD!!!\n");
  162. else{
  163. for (int i = 0; i < edges; i++){
  164. for (int s = 0; s < edges; s++){
  165. if (dotes[i].begin == ver || dotes[i].end == ver){
  166. for (int j = i; j < edges - 1; j++){
  167. dotes[j].begin = dotes[j + 1].begin;
  168. dotes[j].end = dotes[j + 1].end;
  169. dotes[j].weight = dotes[j + 1].weight;
  170. }
  171. dotes = (struct DOT *)realloc((void *)dotes, (edges = edges - 1)*sizeof(struct DOT));
  172. }
  173. }
  174. }
  175. for (int p = 0; p < edges; p++){
  176. if (dotes[p].begin>ver)
  177. dotes[p].begin -= 1;
  178. if (dotes[p].end > ver)
  179. dotes[p].end -= 1;
  180. }
  181. dots = dots - 1;
  182. }
  183. }
  184.  
  185. void addedge(){
  186. int tempb = 0;
  187. int tempe = 0;
  188. int tempw = 0;
  189. printf("Input BEGIN and END and WEIGHT: ");
  190. scanf("%d %d %d", &tempb, &tempe, &tempw);
  191. if ((tempb < 0 && tempb >= dots) || (tempe < 0 && tempe >= dots) || tempb == tempe)
  192. {
  193. printf("BAD\n");
  194. mainmenu();
  195. }
  196. else{
  197. int target = 0;
  198. for (int i = 0; i < edges; i++){
  199. if (tempb == dotes[i].begin && tempe == dotes[i].end)
  200. target = 1;
  201. }
  202. if (target == 1){
  203. printf("BAD\n");
  204. mainmenu();
  205. }
  206. else{
  207. dotes = (struct DOT *)realloc((void *)dotes, (edges = edges + 1)*sizeof(struct DOT));
  208. dotes[edges - 1].begin = tempb;
  209. dotes[edges - 1].end = tempe;
  210. dotes[edges - 1].weight = tempw;
  211. }
  212. }
  213. }
  214.  
  215. int parse_string(char *s) {
  216. int i = 0;
  217. int j;
  218. while (s[i] >= '0' && s[i] <= '9')
  219. ++i;
  220. if (i == 0 || s[i] == '\0')
  221. return 0;
  222. char *buffer = (char*)malloc(i + 1);
  223. for (j = 0; j < i; j++)
  224. buffer[j] = s[j];
  225. buffer[i] = '\0';
  226. buff_b = atoi(buffer);
  227. free(buffer);
  228.  
  229. while ((s[i] < '0' || s[i] > '9') && s[i] != '\0')
  230. ++i;
  231. if (s[i] == '\0')
  232. return 0;
  233. int snd_begin = i;
  234. while (s[i] >= '0' && s[i] <= '9')
  235. ++i;
  236. if (s[i] == '\0')
  237. return 0;
  238. buffer = (char*)malloc(i - snd_begin + 1);
  239. for (j = snd_begin; j < i; j++)
  240. buffer[j - snd_begin] = s[j];
  241. buffer[i - snd_begin] = '\0';
  242. buff_end = atoi(buffer);
  243. free(buffer);
  244.  
  245. while ((s[i] < '0' || s[i] > '9') && s[i] != '\0')
  246. ++i;
  247. if (s[i] == '\0')
  248. return 0;
  249. snd_begin = i;
  250. while (s[i] >= '0' && s[i] <= '9')
  251. ++i;
  252. if (s[i] == '\0')
  253. return 0;
  254. buffer = (char*)malloc(i - snd_begin + 1);
  255. for (j = snd_begin; j < i; j++)
  256. buffer[j - snd_begin] = s[j];
  257. buffer[i - snd_begin] = '\0';
  258. buff_w = atoi(buffer);
  259. free(buffer);
  260. return 1;
  261. }
  262.  
  263. void loadit(){
  264. FILE *input = fopen("graph.txt", "r+");
  265. if (input == NULL){
  266. printf("CANNOT OPEN THIS \n");
  267. }
  268. else{
  269. char s[1024];
  270. //dotes = (DOT *)malloc(edges * sizeof(DOT)); // массив структур
  271. dotes = (struct DOT *)realloc((void *)dotes, (edges)*sizeof(struct DOT));
  272. while (!feof(input)){
  273. fgets(s, 1024, input);
  274. if (parse_string(s)) {
  275. dotes = (struct DOT *)realloc((void *)dotes, (edges = edges + 1)*sizeof(struct DOT));
  276. dotes[edges - 1].begin = buff_b;
  277. dotes[edges - 1].end = buff_end;
  278. dotes[edges - 1].weight = buff_w;
  279. if (dotes[edges - 1].begin + 1 >= dots)
  280. dots = dotes[edges - 1].begin + 1;
  281. if (dotes[edges - 1].end + 1 >= dots)
  282. dots = dotes[edges - 1].end + 1;
  283. }
  284. }
  285. fclose(input);
  286. }
  287. }
Advertisement
Add Comment
Please, Sign In to add comment