Advertisement
leonard007

Prim AA

Dec 17th, 2022
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define N_MAX 105
  5.  
  6. int matrice[N_MAX][N_MAX];
  7. int contor=0;
  8. int nodes[N_MAX];
  9. int vizitat[N_MAX]; // se intializeaza automat cu 0, nodurile fiind initial nevizitate
  10. int lista[N_MAX];
  11. int culoare[N_MAX];
  12. int timp_init[N_MAX];
  13. int timp_final[N_MAX];
  14. int timp;
  15. int sp[N_MAX];
  16.  
  17. void initializare()
  18. {
  19.     int i,j;
  20.     for(i=0;i<N_MAX;i++)
  21.     {
  22.         for(j=0;j<N_MAX;j++)
  23.         {
  24.             matrice[i][j] = 0;
  25.         }
  26.     }
  27. }
  28.  
  29. void introducere_nod(int i)
  30. {
  31.     nodes[contor++] = i;
  32. }
  33.  
  34. void DFS(int nodStart) // DFS
  35. {
  36.     printf("%d ",nodStart);
  37.     vizitat[nodStart] = 1; // initializam primul nod, pe care l si introducem de la tastatura ca fiind vizitat;
  38.     for(int i=0;i<N_MAX;i++)
  39.     {
  40.         if(matrice[nodStart][i] && !vizitat[i])
  41.         {
  42.             DFS(i);
  43.         }
  44.     }
  45. }
  46. /*//vector culoare
  47. //vector sp-structura precedenta;
  48. //timp_init  si timp_final[x] - memoram momentul in care e colorat in negru*/
  49.  
  50. void CautareInAdancime(int nod)
  51. {
  52.     culoare[nod] = -1; // -1 adica gri
  53.     timp++;
  54.     timp_init[nod] = timp;
  55.     for(int i=0;i<N_MAX;i++)
  56.     {
  57.         if(matrice[nod][i] && culoare[i]==0)
  58.         {
  59.             sp[i] = nod;
  60.             CautareInAdancime(i);
  61.         }
  62.     }
  63.     culoare[nod] = 1; /* se seteaza culoarea pe negru */
  64.     timp++;
  65.     timp_final[nod] = timp;
  66. }
  67. void TraversareInAdancime()
  68. {
  69.     for(int i=0;i<N_MAX;i++)
  70.     {
  71.         culoare[i] = 0; /* 0 - alb */
  72.         sp[i] = 0;
  73.     }
  74.     timp = 0;
  75.     for(int i=0;i<N_MAX;i++)
  76.     {
  77.         if(!culoare[i])
  78.             CautareInAdancime(i);
  79.     }
  80. }
  81. /* -1 = gri / 0 = alb / 1 = negru */
  82.  
  83.  
  84. void introducere_arc(int i,int j,int cost)
  85. {
  86.     int index,ai,aj;
  87.     for(index=0;index<N_MAX;index++)
  88.     {
  89.         if(nodes[index] == i)
  90.             ai = index;
  91.     }
  92.     for(index=0;index<N_MAX;index++)
  93.     {
  94.         if(nodes[index] == j)
  95.             aj = index;
  96.     }
  97.  
  98.     matrice[ai][aj] = cost;
  99.     matrice[aj][ai] = cost;
  100. }
  101.  
  102. void stergere_arc(int i,int j)
  103. {
  104.     int index,ai,aj;
  105.     for(index=0;index<N_MAX;index++)
  106.     {
  107.         if(nodes[index] == i)
  108.             ai = index;
  109.     }
  110.     for(index=0;index<N_MAX;index++)
  111.     {
  112.         if(nodes[index] == j)
  113.             aj = index;
  114.     }
  115.     matrice[ai][aj] = 0;
  116.     matrice[aj][ai] = 0;
  117. }
  118.  
  119. void afisare_matrice()
  120. {
  121.     int i,j;
  122.     for(i=0;i<contor;i++)
  123.     {
  124.         for(j=0;j<contor;j++)
  125.         {
  126.             printf("%d ",matrice[i][j]);
  127.         }
  128.         printf("\n");
  129.     }
  130.     printf("\n");
  131.  
  132. }
  133.  
  134. void suprima_nod(int i) {
  135.     int a, b, x;
  136.     for (a = 0; a < contor; a++) {
  137.         if (nodes[a] == i) {
  138.             x = a;
  139.         }
  140.     }
  141.     for (a = x; a <= contor - 1; a++) {
  142.         nodes[a] = nodes[a + 1];
  143.     }
  144.  
  145.     for (a = x; a <= contor; a++) {
  146.         for (b = 0; b < contor; b++) {
  147.             matrice[a][b] = matrice[a + 1][b];
  148.         }
  149.     }
  150.     for (b = x; b <= contor; b++) {
  151.         for (a = 0; a < contor; a++) {
  152.             matrice[a][b] = matrice[a][b + 1];
  153.  
  154.         }
  155.     }
  156.     contor--;
  157.  
  158. }
  159. int Prim(int nod)
  160. {
  161.     int vector[N_MAX],a[N_MAX][N_MAX];
  162.     int parinte,min,j,cost=0;
  163.     vizitat[nod] = 1;
  164.     for (int i = 0; i < contor; ++i) {
  165.         vector[i] = nod;
  166.     }
  167.     vector[nod] = 0;
  168.  
  169.     for (int j = 0; j < contor-1; ++j) {
  170.         min=INT_MAX;
  171.         parinte=0;
  172.         for (int i = 0; i < contor; ++i) {
  173.             if(!vizitat[i] && min>a[i][vector[i]])
  174.             {
  175.                 min = a[i][vector[i]];
  176.                 parinte = i;
  177.             }
  178.             vizitat[parinte] = 1;
  179.         }
  180.     }
  181.     for (int i = 0; i < contor; ++i) {
  182.         if(!vizitat[i] && a[i][vector[i]] > a[i][parinte])
  183.             vector[i] = parinte;
  184.     }
  185.     cost += min;
  186.     return cost;
  187. }
  188.  
  189. int main()
  190. {
  191.     int costt;
  192.     int opt;
  193.     int a,b,c,nodInceput,nodStart;
  194.     while(1)
  195.     {
  196.         printf("1.Initializare noduri cu 0\n");
  197.         printf("2.Introducere nod\n");
  198.         printf("3.Introducere arc\n");
  199.         printf("4.Stergere nod\n");
  200.         printf("5.stergere arc\n");
  201.         printf("6.Afisare matrice adiacenta\n");
  202.         printf("7.Exit\n");
  203.         printf("8.Parcurgere in adancime basic\n");
  204.         printf("9.Parcurgere in adancime CLR\n");
  205.         printf("\nIntroduceti opt:");
  206.         scanf("%d",&opt);
  207.         switch(opt)
  208.         {
  209.             case 1:
  210.                 initializare();
  211.                 break;
  212.             case 2:
  213.                 scanf("%d",&a);
  214.                 introducere_nod(a);
  215.                 break;
  216.             case 3:
  217.                 scanf("%d",&b);
  218.                 scanf("%d",&c);
  219.                 scanf("%d",costt);
  220.                 introducere_arc(b,c,costt);
  221.                 break;
  222.             case 4:
  223.                 scanf("%d",&a);
  224.                 suprima_nod(a);
  225.                 break;
  226.             case 5:
  227.                 scanf("%d",&b);
  228.                 scanf("%d",&c);
  229.                 stergere_arc(b,c);
  230.                 break;
  231.             case 6:
  232.                 afisare_matrice();
  233.                 break;
  234.             case 7:
  235.                 exit(0);
  236.             case 8:
  237.                 printf("Introduceti nodul de la care doriti sa incepeti: \n");
  238.                 scanf("%d",&nodInceput);
  239.                 DFS(nodInceput);
  240.                 printf("\n");
  241.                 break;
  242.             case 9:
  243.                 printf("\n");
  244.                 TraversareInAdancime();
  245.             case 10:
  246.                 printf("Introduceti nodul de la care doriti sa incepeti");
  247.                 scanf("%d",&nodStart);
  248.                 printf("%d",Prim(nodStart));
  249.                 break;
  250.             default:
  251.                 printf("Ati introdus optiunea gresita\n");
  252.                 break;
  253.  
  254.         }
  255.     }
  256.     return 0;
  257. }
  258.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement