Advertisement
frentzy

kruskal

Jan 14th, 2019
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NMAX 100
  5. #define MMAX 9900
  6.  
  7. typedef struct edge {
  8.           int u, v;
  9.           int c;
  10.         } EDGE;
  11.  
  12. EDGE e[MMAX / 2];
  13. EDGE tree[NMAX - 1];
  14. int last;
  15. int tata[NMAX + 1];
  16.  
  17.  
  18. int cmp(const void* a, const void* b) {
  19.   EDGE* pa = (EDGE*)a;
  20.   EDGE* pb = (EDGE*)b;
  21.  
  22.   if (pa->c == pb->c) {
  23.     if (pa->u == pb->u) {
  24.       return pa->v - pb->v;
  25.     } else {
  26.         return pa->u - pb->u;
  27.     }
  28.   } else {
  29.       return pa->c - pb->c;
  30.   }
  31. }
  32.  
  33. int find(int v) {
  34.   int u, r;
  35.  
  36.   u = v;
  37.   while (tata[u] > 0) {
  38.     u = tata[u];
  39.   }
  40.  
  41.   r = u;
  42.   u = v;
  43.   while (tata[u] > 0) {
  44.     v = tata[u];
  45.     tata[u] = r;
  46.     u = v;
  47.   }
  48.  
  49.   return r;
  50. }
  51.  
  52. void join(int ra, int rb) {
  53.   if (tata[ra] < tata[rb]) {
  54.     tata[ra] += tata[rb];
  55.     tata[rb] = ra;
  56.   } else {
  57.       tata[rb] += tata[ra];
  58.       tata[ra] = rb;
  59.   }
  60. }
  61.  
  62. int kruskal(int n, int m) {
  63.   int i, ra, rb, found;
  64.   int cost = 0;
  65.  
  66.   for (i = 1; i<= n; i++) {
  67.     tata[i] = -1;
  68.   }
  69.  
  70.   last = 0;
  71.   i = 0;
  72.   while ((i < m) && (last < n - 1)) {
  73.     found = 0;
  74.     while ((i < m) && !found) {
  75.       ra = find(e[i].u);
  76.       rb = find(e[i].v);
  77.  
  78.       if (ra != rb) {
  79.         join(ra, rb);
  80.  
  81.         tree[last++] = e[i];
  82.         cost += e[i].c;
  83.         found = 1;
  84.       }
  85.       i++;
  86.     }
  87.   }
  88.  
  89.   return cost;
  90. }
  91.  
  92.  
  93. int main() {
  94.   FILE *fin, *fout;
  95.   int n, m, i, aux, cost;
  96.  
  97.   fin = fopen("kruskal.in", "r");
  98.   fout = fopen("kruskal.out", "w");
  99.  
  100.   fscanf(fin, "%d %d", &n, &m);
  101.  
  102.   for (i = 0; i < m; i++) {
  103.     fscanf(fin, "%d %d %d", &e[i].u, &e[i].v, &e[i].c);
  104.  
  105.     if (e[i].u > e[i].v) {
  106.       aux = e[i].u; e[i].u = e[i].v; e[i].v = aux;
  107.     }
  108.   }
  109.  
  110.   qsort(e, m, sizeof(EDGE), cmp);
  111.  
  112.   cost = kruskal(n, m);
  113.    
  114.   fprintf(fout, "%d\n", cost);
  115.   for (i = 0; i < last; i++) {
  116.     fprintf(fout, "%d %d\n", tree[i].u, tree[i].v);
  117.   }
  118.  
  119.   fclose(fin);
  120.   fclose(fout);
  121.  
  122.   return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement