bhupixb

DAA3

Feb 13th, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.47 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. #include "limits.h"
  5.  
  6. typedef struct graph {
  7. int u, v, wt;
  8. }graph;
  9.  
  10. int validate(int n) {
  11. while (1) {
  12. if (scanf("%d", &n)) return n;
  13. printf("Please enter a valid integer\n");
  14. }
  15. }
  16.  
  17. void rec(int *parent, int cur) {
  18. if (parent[cur] == cur) {printf("%d ", cur+1); return;}
  19. rec(parent, parent[cur]);
  20. printf("%d ", cur+1);
  21. }
  22.  
  23. int main() {
  24. graph *ins = NULL;
  25. int ch, nodes, edges, tmp, u, v;
  26. int wt, fl = 0, sourceVertex, neg;
  27. int *dist = NULL, *parent = NULL, j;
  28. while (1) {
  29. printf("Enter 1)Input 2)Output 0)Exit\n");
  30. ch = validate(ch);
  31. switch(ch) {
  32. case 1:
  33. printf("Enter the number of nodes and edges\n");
  34. if (ins != NULL) free(ins);
  35. nodes = validate(nodes);
  36. while (nodes < 2) {
  37. printf("Please enter atleast 2 nodes\n");
  38. nodes = validate(nodes);
  39. }
  40. edges = validate(edges);
  41. while (edges < nodes-1 || edges > nodes*(nodes-1)) {
  42. printf("Please enter positive number of edges\n");
  43. edges = validate(edges);
  44. }
  45. printf("For next %d lines enter source, destination and weight of edge\n", edges);
  46. ins = (graph*)malloc(sizeof(graph)*edges);
  47. for (int i = 0; i < edges; ) {
  48. u = validate(u), v = validate(v), wt = validate(wt);
  49. if (u < 1 || v < 1 || u > nodes || v > nodes) {
  50. printf("Node value out of range, please enter again\n");
  51. }
  52. else {
  53. j = 0;
  54. --u, --v;
  55. for (; j < i; ++j) {
  56. if (ins[j].u == u && ins[j].v == v) {
  57. printf("Edge already exist with weight %d, Do you want to modify weight enter 1 else 0\n", ins[j].wt);
  58. tmp = validate(tmp);
  59. if (tmp == 1) {
  60. ins[j].wt = wt;
  61. }
  62. }
  63. }
  64. if (j==i) {
  65. ins[i].u = u, ins[i].v = v, ins[i].wt = wt;
  66. ++i;
  67. }
  68. }
  69. }
  70. break;
  71.  
  72. case 2:
  73. // for (int i = 0; i < edges; ++i)
  74. // printf("%d %d %d\n", ins[i].u, ins[i].v, ins[i].wt);
  75. printf("Enter source vertex \n");
  76. sourceVertex = validate(sourceVertex);
  77. while (sourceVertex < 0 || sourceVertex > nodes) {
  78. printf("Please enter a valid source vertex\n");
  79. sourceVertex = validate(sourceVertex);
  80. }
  81. --sourceVertex;
  82. dist = (int*)malloc(sizeof(int)*(nodes));
  83. parent = (int*)malloc(sizeof(int)*(nodes));
  84. for (int i = 0; i < nodes; i++) {
  85. dist[i] = INT_MAX, parent[i] = -1;
  86. }
  87. dist[sourceVertex] = 0;
  88. parent[sourceVertex] = sourceVertex;
  89. for (int i = 1; i < nodes; i++) {
  90. neg = -1;
  91. for (int j = 0; j < edges; j++) {
  92. int u = ins[j].u;
  93. int v = ins[j].v;
  94. int wt = ins[j].wt;
  95. if (dist[u] != INT_MAX && dist[u] + wt < dist[v]) {
  96. dist[v] = dist[u] + wt;
  97. neg = v;
  98. parent[v] = u;
  99. }
  100. }
  101. if (neg == -1) break;
  102. }
  103. if (neg != -1) {
  104. neg = -1;
  105. for (int j = 0; j < edges; ++j) {
  106. int u = ins[j].u;
  107. int v = ins[j].v;
  108. int wt = ins[j].wt;
  109. if (dist[u] != INT_MAX && dist[u] + wt < dist[v]) {
  110. neg = v;
  111. break;
  112. }
  113. }
  114. }
  115. // for (int i = 0; i < nodes; ++i)
  116. // printf("%d %d\n", i, parent[i]);
  117. printf("\n");
  118. if (neg != -1) {
  119. printf("Negative Weight cycle exists\n");
  120. }
  121. else {
  122. for (int i = 0; i < nodes; ++i) {
  123. if (i == sourceVertex) {
  124. }
  125. else if (parent[i] == -1) {
  126. printf("for %d Path does not exists\n", i+1);
  127. }
  128. else {
  129. printf("Dist of %d is %d and Path is-> ", i+1, dist[i]);
  130. tmp = i;
  131. rec(parent, i);
  132. printf("\n");
  133. }
  134. }
  135. }
  136. free(dist);
  137. free(parent);
  138. break;
  139.  
  140. case 0:
  141. if (ins != NULL) free(ins);
  142. exit(0);
  143. break;
  144. }
  145. }
  146. return 0;
  147. }
Add Comment
Please, Sign In to add comment