Source code for submission s757

spider.cpp

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. #define MAXV 2000
  8. #define MAXINT 200000
  9.  
  10. static int maxlength;
  11. static int totallength;
  12. static int v1,v2;
  13.  
  14. struct edgenode{
  15. int y;
  16. int weight;
  17. struct edgenode *next;
  18. };
  19.  
  20. struct graph{
  21. edgenode *edges[MAXV+1];
  22. int degree[MAXV+1];
  23. int nvertices;
  24. int nedges;
  25. };
  26.  
  27. void initialize_graph(graph *g) {
  28. int i;
  29.  
  30. g->nvertices = 0;
  31. g->nedges = 0;
  32.  
  33. for(i=1; i<=MAXV; i++) g->degree[i] = 0;
  34. for(i=1; i<=MAXV; i++) g->edges[i] = 0;
  35. }
  36.  
  37. void insert_edge(graph *g, int x, int y, int weight) {
  38. edgenode *p;
  39.  
  40. p = (edgenode*)malloc(sizeof(edgenode));
  41.  
  42. p->weight = weight;
  43. p->y = y;
  44. p->next = g->edges[x];
  45.  
  46. g->edges[x] = p;
  47.  
  48. g->degree[x]++;
  49.  
  50. edgenode *q;
  51.  
  52. q = (edgenode*)malloc(sizeof(edgenode));
  53.  
  54. q->weight = weight;
  55. q->y = x;
  56. q->next = g->edges[y];
  57.  
  58. g->edges[y] = q;
  59.  
  60. g->degree[y]++;
  61.  
  62. }
  63.  
  64. bool read_graph(graph *g) {
  65. int i;
  66. int m;
  67. int x, y;
  68. int weight;
  69.  
  70.  
  71. initialize_graph(g);
  72.  
  73. if (scanf("%d %d", &(g->nvertices), &m)==EOF) return false;
  74.  
  75. for(i = 1; i <= m; i++) {
  76. scanf("%d %d %d", &x, &y, &weight);
  77. if (maxlength<weight) {
  78. maxlength=weight;
  79. v1 = x;
  80. v2 = y;
  81. }
  82. insert_edge(g,x,y,weight);
  83. }
  84.  
  85. return true;
  86. }
  87.  
  88. bool prim(graph *g, int start, int uztamje) {
  89. int i;
  90. edgenode *p;
  91. bool intree[MAXV+1];
  92. int distance[MAXV+1];
  93. int v;
  94. int w;
  95. int weight;
  96. int dist;
  97.  
  98. for(i=1; i <= g->nvertices; i++) {
  99. intree[i] = false;
  100. distance[i] = MAXINT;
  101. //parent[i] = -1;
  102. }
  103.  
  104. /*intree[v1]=*/intree[uztamje]=true;
  105. //totallength
  106.  
  107. distance[start] = 0;
  108. v = start;
  109.  
  110. while(intree[v] == false) {
  111. intree[v] = true;
  112. p = g->edges[v];
  113. while(p != NULL) {
  114. w = p->y;
  115. weight = p->weight;
  116. if((distance[w] > weight) && (intree[w] == false)) {
  117. distance[w] = weight;
  118. //parent[w] = v;
  119. //maxlength = max(weight, maxlength);
  120. //printf("w: %d\n",weight);
  121. totallength += weight;
  122. }
  123. p = p->next;
  124. }
  125.  
  126. v = 1;
  127. dist = MAXINT;
  128. for(i = 1; i <= g->nvertices; i++) {
  129. if((intree[i] == false) && (dist > distance[i])) {
  130. dist = distance[i];
  131. v = i;
  132. }
  133. }
  134.  
  135. }
  136. for (int i=1; i<=g->nvertices; i++) {
  137. if (!intree[i]) return false;
  138. }
  139. return true;
  140. }
  141.  
  142.  
  143.  
  144. int main()
  145. {
  146.  
  147. graph *g = (graph*)malloc(sizeof(graph));
  148.  
  149. while (read_graph(g)) {
  150. //maxlength = -1;
  151. totallength = 0;
  152. if (!prim(g,v1, v2)) {
  153. printf("disconnected\n");
  154. continue;
  155. }
  156. //printf("%d %d\n", maxlength, totallength);
  157. int total = totallength;
  158. totallength = 0;
  159. prim(g,v2, v1);
  160. printf("%d\n", min(total,totallength)-maxlength);
  161.  
  162. }
  163. return 0;
  164. }