Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. typedef struct treeEdge {
  6. int begin, end;
  7. int len;
  8. int next;
  9. } Edge;
  10.  
  11. int fEdges(int n, int m, Edge* edges) {
  12. int a, b, l;
  13. for (int i = 0; i < m; i++) {
  14. if (scanf("%d%d%d", &a, &b, &l) < 3) {
  15. printf("bad number of lines\n");
  16. return 0;
  17. }
  18. if ((a < 1) || (a > n) || (b < 1) || (b > n)) {
  19. printf("bad vertex\n");
  20. return 0;
  21. }
  22. if ((l > INT_MAX)|| (l < 0)) {
  23. printf("bad length\n");
  24. return 0;
  25. }
  26. edges[i].begin = a - 1;
  27. edges[i].end = b - 1;
  28. edges[i].len = l;
  29. edges[i].next = 0;
  30. }
  31. return 1;
  32. }
  33.  
  34. int compare(const Edge* a, const Edge* b) {
  35. return a->len - b->len;
  36. }
  37.  
  38. int minTree(int n, int m, Edge* edges) {
  39. if (!n) {
  40. return 0;
  41. }
  42. qsort(edges, m, sizeof(Edge), compare);
  43. int* components = malloc(sizeof(int) * n);
  44.  
  45. for (int i = 0; i < n; i++) {
  46. components[i] = i;
  47. }
  48. for (int i = 0; i < m; i++) {
  49. int compBegin = components[edges[i].begin];
  50. int compEnd = components[edges[i].end];
  51. if (compBegin != compEnd) {
  52. edges[i].next = 1;
  53. for (int j = 0; j < n; j++) {
  54. if (components[j] == compBegin) {
  55. components[j] = compEnd;
  56. }
  57. }
  58. }
  59. }
  60. for (int i = 1; i < n; i++) {
  61. if (components[0] != components[i]) {
  62. free(components);
  63. return 0;
  64. }
  65. }
  66. free(components);
  67. return 1;
  68. }
  69.  
  70. int main() {
  71. int n, m;
  72. if (scanf("%d%d", &n, &m) != 2) {
  73. printf("bad number of lines\n");
  74. return 0;
  75. } else {
  76. if ((n > 5000) || (n < 0)) {
  77. printf("bad number of vertices\n");
  78. return 0;
  79. } else {
  80. if ((m > n * (n - 1) / 2) || (m < 0)) {
  81. printf("bad number of edges\n");
  82. return 0;
  83. }
  84. }
  85. }
  86.  
  87. Edge* edges = malloc(sizeof(Edge) * m);
  88.  
  89. if (!fEdges(n, m, edges)) {
  90. return;
  91. }
  92. if (minTree(n, m, edges)) {
  93. for (int i = 0; i < m; i++) {
  94. if (edges[i].next) {
  95. printf("%d %d\n", edges[i].begin + 1, edges[i].end + 1);
  96. }
  97. }
  98. }
  99. else {
  100. printf("no spanning tree\n");
  101. }
  102. free(edges);
  103.  
  104. return 0;
  105.  
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement