Advertisement
leonard007

Untitled

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