Advertisement
AnindyaBiswas

DSU

Jul 27th, 2022
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.54 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. #define N 64
  5. int U[N];
  6.  
  7. void Initilize()
  8. {
  9.     for(int i=0 ; i < N ; i++)
  10.     {
  11.         U[i] = i;
  12.     }
  13. }
  14.  
  15. typedef struct Sub_Set
  16. {
  17.     int no;
  18.     unsigned ss[N/sizeof(int)];
  19.     struct Sub_Set *nxt;
  20. }Sub_Set;
  21.  
  22. Sub_Set* Search_Set(Sub_Set *head, int set_no)
  23. {
  24.     Sub_Set *x = head;
  25.     while(x != NULL)
  26.     {
  27.         if(x->no == set_no)
  28.         {
  29.             return x;
  30.         }
  31.         x = x->nxt;
  32.     }
  33.     return NULL;
  34. }
  35.  
  36. void Add_Element(Sub_Set **ptr)
  37. {
  38.     int ans = 1, e;
  39.     for(int i=0;i<N && ans==1;i++)
  40.     {
  41.         printf("\nEnter the element : ");
  42.         scanf("%d", &e);
  43.         if(e>=0 && e<N)
  44.         {
  45.             //(*ptr)->ss[e / 32] += 1 << (e % 32);
  46.             (*ptr)->ss[e / 32] |= 1 << (e % 32);
  47.            
  48.         }
  49.         else
  50.         {
  51.             printf("\nInvalid!");
  52.         }
  53.         printf("\n\n Continue? ");
  54.         scanf("%d", &ans);
  55.     }
  56. }
  57.  
  58. void New_Subset(Sub_Set **head)
  59. {
  60.     static int c = 1;
  61.     int e, ans = 1;
  62.     Sub_Set *ptr;
  63.     ptr = (Sub_Set*)malloc(sizeof(Sub_Set));
  64.    
  65.     for(int i=0;i<N/sizeof(int);i++)
  66.     {
  67.         ptr->ss[i] = 0;
  68.     }
  69.     ptr->no = c++;
  70.     Add_Element(&ptr);
  71.  
  72.      if(*head == NULL)
  73.     {
  74.         *head = ptr;
  75.     }
  76.     else
  77.     {
  78.         Sub_Set *x = *head;
  79.         while(x->nxt!=NULL)
  80.             x=x->nxt;
  81.         x->nxt = ptr;
  82.     }
  83.    
  84. }
  85.  
  86. void Add_to_Existing(Sub_Set **head)
  87. {
  88.     int set_no;
  89.     Sub_Set *x;
  90.     printf("\nEnter the Set No. : ");
  91.     scanf("%d", &set_no);
  92.     x = Search_Set(*head, set_no);
  93.     if(x == NULL)
  94.     {
  95.         printf("\nNo such Set");
  96.         return;
  97.     }
  98.     Add_Element(&x);
  99. }
  100.  
  101. void Display(Sub_Set *x)
  102. {
  103.     if(x==NULL)
  104.         return;
  105.     printf("Set No. %d ---> { ",x->no);
  106.    
  107.     for(int i=0;i<N/sizeof(int);i++)
  108.     {
  109.         unsigned int c = 0, h = x->ss[i];
  110.         while(h!=0)
  111.         {
  112.             if(h % 2 == 1)  
  113.                 printf("%d ", c+32*i);
  114.             h = h/2;
  115.             c++;
  116.         }
  117.     }
  118.     printf("}\n");
  119. }
  120.  
  121. void Display_All(Sub_Set *head)
  122. {
  123.     if(head == NULL)
  124.     {
  125.         printf("\n<No Sub-sets>");
  126.         return;
  127.     }
  128.     Sub_Set *x = head;
  129.     printf("\n\t<---Sub-sets--->:\n");
  130.     while(x != NULL)
  131.     {
  132.         Display(x);
  133.         x=x->nxt;
  134.     }
  135. }
  136.  
  137. int Check_Set(Sub_Set *x, int s)
  138. {
  139.     if((x->ss[s/32] | 1<<(s%32)) == x->ss[s/32])
  140.         return 1;
  141.     else
  142.         return 0;
  143. }
  144.  
  145. void Present_or_not(Sub_Set *head)
  146. {
  147.     int set_no, s, flag = -1;
  148.     printf("\nEnter the Set no. : ");
  149.     scanf("%d", &set_no);
  150.     printf("\nEnter the no to be searched : ");
  151.     scanf("%d", &s);
  152.  
  153.     Sub_Set *x = Search_Set(head,set_no);
  154.  
  155.     if(x == NULL)
  156.     {
  157.         printf("\nNo such Set");
  158.         return;
  159.     }
  160.  
  161.     if(Check_Set(x, s))
  162.         printf("\nPresent!");
  163.     else
  164.         printf("\nNot Present!");
  165. }
  166.  
  167.  
  168.  
  169. void main()
  170. {
  171.     unsigned int b = 1<<31;
  172.     printf("\nb = %u ",b);
  173.     Sub_Set *head = NULL;
  174.     int a;
  175.     while(1)
  176.     {
  177.         printf("\n\n1. Add New Subset\n2. Display All\n3. Present or Not\n4. Add Existing\n0. Exit");
  178.         printf("\n Enter your choice : ");
  179.         scanf("%d", &a);
  180.         switch(a)
  181.         {
  182.             case 1: New_Subset(&head);
  183.                     break;
  184.             case 2: Display_All(head);
  185.                     break;
  186.             case 3: Present_or_not(head);
  187.                     break;
  188.             case 4: Add_to_Existing(&head);
  189.                     break;
  190.             case 0: return;
  191.             default: continue;  
  192.         }
  193.     }
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement