Advertisement
Guest User

Minimum Spanning Tree Kruskal - Second Minimum Spanning Tree - Linked List Disjoint Sets

a guest
Feb 24th, 2011
1,020
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.34 KB | None | 0 0
  1. // Implemantation Linked List represantation of Disjoint Sets
  2. // Kruskal Implemantation
  3. // Solves MST and Second MST
  4. // by Iraklis Karagkiozoglou <i.kar@windowslive.com> 24/02/2011
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #define MAXNODES 2000
  8. #define MAXEDGES 1000000
  9. typedef struct node_t node_t;
  10. typedef struct edge_t edge_t;
  11.  
  12. struct edge_t {
  13.     node_t *n1, *n2;
  14.     unsigned int cost, used;
  15. };
  16.  
  17. struct node_t {
  18.     node_t *parent, *root, *next, *last;
  19. };
  20.  
  21. node_t nodes[MAXNODES];
  22. edge_t edges[MAXEDGES];
  23. unsigned int lasti;
  24.  
  25. void makenode(node_t *n1) {
  26.     (*n1).last = (*n1).parent = (*n1).root = n1;
  27.     (*n1).next = NULL;
  28. }
  29.  
  30. void myunion(node_t *n1, node_t *n2) {
  31.     n1 = (*n1).root;
  32.     n2 = (*n2).root;
  33.     (*n2).root = n1;
  34.     (*n2).parent = (*n1).last;
  35.     (*(*n1).last).next = n2;
  36.     while((*n2).next!=NULL) {
  37.         n2 = (*n2).next;
  38.         (*n2).root = n1;
  39.     }
  40. }
  41.  
  42. int findset(node_t *n1, node_t *n2) {
  43.     if((*n1).root==(*n2).root) return 1;
  44.     else return 0;
  45. }
  46.  
  47. int cmp(const void *a, const void *b) {
  48.     if((*(edge_t *)a).cost>(*(edge_t *)b).cost) return 1;
  49.     else return -1;
  50. }
  51.  
  52. unsigned int mst_kruskal(unsigned int n, unsigned int e, unsigned int cost, unsigned int num, unsigned int j, unsigned int usede) {
  53.     unsigned int i;
  54.     for(i=j;i<e;i++) {
  55.         if(num<n-1){
  56.             if(findset(edges[i].n1,edges[i].n2)==0 && (i+1)!=usede) {
  57.                 myunion(edges[i].n1,edges[i].n2);
  58.                 if(usede==0) {
  59.                     edges[i].used=1;
  60.                 }
  61.                 cost+=edges[i].cost;
  62.                 num++;
  63.                 lasti=i;
  64.             }
  65.         }
  66.         else break;
  67.     }
  68.     return cost;
  69. }
  70.  
  71. unsigned int second_kruskal(unsigned int n, unsigned int m, unsigned int cost1, unsigned int j) {
  72.     unsigned int i, min=cost1, c, k, num;
  73.     for(i=j+1;i>0;i--) {
  74.         if(edges[i-1].used==1) {
  75.             num=0;
  76.             for(k=0;k<n;k++) makenode(&nodes[k]);
  77.             c = mst_kruskal(n,m,0,0,0,i);
  78.             if(min==cost1 || min>c) min =c;
  79.         }
  80.     }
  81.     return min;
  82. }
  83.  
  84. int main() {
  85.     unsigned int n, m, i, j, k, res1, res2;
  86.     FILE *f = fopen("christmas.in","r");
  87.     fscanf(f,"%u %u\n",&n,&m);
  88.     for(i=0;i<m;i++) {
  89.         fscanf(f,"%u %u %u\n",&j,&k,&edges[i].cost);
  90.         edges[i].n1 = &nodes[j-1];
  91.         edges[i].n2 = &nodes[k-1];
  92.         makenode(edges[i].n1);
  93.         makenode(edges[i].n2);
  94.     }
  95.     fclose(f);
  96.     qsort(edges,m,sizeof(edge_t),cmp);
  97.     res1 = mst_kruskal(n,m,0,0,0,0);
  98.     res2 = second_kruskal(n,m,res1,lasti);
  99.     f = fopen("christmas.out","w");
  100.     fprintf(f,"%u %u\n",res1,res2);
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement