Advertisement
majczel23000

BFS, DFS, macierz sąsiedztwa, lista sąsiedztwa

Jan 8th, 2018
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <stdlib.h>
  4. #include <queue>
  5. using namespace std;
  6.  
  7. const int N = 5;
  8. int graf[N][N];
  9. int waga[N][N];
  10. int odwiedzony[N]= {0}; //0 nieodwiedzony, 1 odwiedzony
  11. queue<int> Q;
  12.  
  13.  
  14. void wpisz()
  15. {
  16.     srand (time(NULL));
  17.     for(int i = 0; i < N; i++)
  18.         for(int j = 0; j < N; j++)
  19.             graf[i][j] = rand() % 2;
  20. }
  21.  
  22. void losuj_waga()
  23. {
  24.     srand (time(NULL));
  25.     for(int i = 0; i < N; i++)
  26.         for(int j = 0; j < N; j++)
  27.             if(graf[i][j] == 1)
  28.                 waga[i][j] = rand()%9 + 1;
  29. }
  30.  
  31. struct lista{
  32.     lista *next;
  33.     int id;
  34. };
  35.  
  36. lista **lista_sasiedztwa;
  37. lista *tail = 0;
  38.  
  39.  
  40. void tworz_liste()
  41. {
  42.     cout<<endl;
  43.     //tworze tablice list
  44.     lista_sasiedztwa = new lista * [N];
  45.     for(int i = 0; i < N; i++)
  46.         lista_sasiedztwa[i] = NULL;
  47.     lista *p, *q;
  48.     for(int i = 0; i < N; i++)
  49.     {
  50.         for(int j = 0; j < N; j++)
  51.         {
  52.             if(graf[i][j] == 1) //jesli sa polaczone to dodaje na koniec listy o indeksie i
  53.             {
  54.                 p = new lista;
  55.                 p->id = j;
  56.                 if(tail==NULL)
  57.                 {
  58.                     lista_sasiedztwa[i] = p;
  59.                     tail = lista_sasiedztwa[i];
  60.                     tail->next = 0;
  61.                 }
  62.                 else
  63.                 {
  64.                     tail->next = p;
  65.                     tail = p;
  66.                     tail->next = 0;
  67.                 }
  68.             }
  69.         }
  70.         tail = 0;
  71.     }
  72.     //wypisuje kazda liste
  73.     for(int i = 0; i < N; i++)
  74.     {
  75.         p = lista_sasiedztwa[i];
  76.         cout<<"["<<i<<"] ";
  77.         while(p!=NULL)
  78.         {
  79.             cout << p->id<<" -> ";
  80.             p = p->next;
  81.         }
  82.         cout << endl;
  83.     }
  84. }
  85.  
  86. void drukuj()
  87. {
  88.     for(int i = 0; i < N; i++)
  89.     {
  90.         for(int j = 0; j < N; j++)
  91.             cout<< graf[i][j]<<" ";
  92.         cout<<endl;
  93.     }
  94.     cout<<endl<<endl;
  95.     for(int i = 0; i < N; i++)
  96.     {
  97.         for(int j = 0; j < N; j++)
  98.             cout<< waga[i][j]<<" ";
  99.         cout<<endl;
  100.     }
  101. }
  102.  
  103. int dd[N];
  104. int prev[N];
  105. //BFS DLA MACIERZY SASIEDZTWA
  106. void BFS(int s)
  107. {
  108.     cout<<endl;
  109.     for(int i = 0; i < N; i++)
  110.         if(i != s)
  111.         {
  112.             odwiedzony[i] = 0;
  113.             dd[i] = -1;
  114.         }
  115.     cout<<s<<" ";
  116.     odwiedzony[s] = 1;
  117.     dd[s] = 0;
  118.     prev[s] = -1;
  119.     Q.push(s);
  120.     while(!Q.empty())
  121.     {
  122.         int u = Q.front();
  123.         for(int i = 0; i < N; i++)
  124.             if(odwiedzony[i] == 0 && graf[u][i] == 1)
  125.             {
  126.                 odwiedzony[i] = 1;
  127.                 dd[i] = dd[u] + 1;
  128.                 prev[i] = u;
  129.                 Q.push(i);
  130.                 cout<<i<<" ";
  131.             }
  132.         Q.pop();
  133.     }
  134.     for(int i = 0; i < N; i++)
  135.         odwiedzony[i] = 0;
  136. }
  137.  
  138. //BFS DLA LIST SASIEDZTWA
  139. void BFS2(int s)
  140. {
  141.     cout<<endl;
  142.     lista *p;
  143.     for(int i = 0; i < N; i++)
  144.         if(i != s)
  145.         {
  146.             odwiedzony[i] = 0;
  147.             dd[i] = -1;
  148.         }
  149.     cout<<s<<" ";
  150.     odwiedzony[s] = 1;
  151.     dd[s] = 0;
  152.     prev[s] = -1;
  153.     Q.push(s);
  154.     while(!Q.empty())
  155.     {
  156.         int u = Q.front();
  157.         p = lista_sasiedztwa[u];
  158.         for(int i = 0; i < N; i++)
  159.         {
  160.             if(p && odwiedzony[p->id]==0)
  161.             {
  162.                 odwiedzony[p->id] = 1;
  163.                 dd[p->id] = dd[u] + 1;
  164.                 prev[p->id] = u;
  165.                 Q.push(p->id);
  166.                 cout<<p->id<<" ";
  167.                 p = p->next;
  168.             }
  169.             else if(p && odwiedzony[p->id] == 1)
  170.                 p = p->next;
  171.         }
  172.  
  173.         Q.pop();
  174.     }
  175. }
  176.  
  177. int f[N];
  178. int timee = 0;
  179. //DFS DLA MACIERZY SASIEDZTWA
  180. void visit(int u)
  181. {
  182.     odwiedzony[u] = 1;
  183.     dd[u] = timee;
  184.     timee++;
  185.     for(int i = 0; i < N; i++)
  186.         if(odwiedzony[i] == 0 && graf[u][i] == 1)
  187.         {
  188.             cout<<i<<" ";
  189.             odwiedzony[i] = 1;
  190.             prev[i] = u;
  191.             visit(i);
  192.             cout<<endl;
  193.         }
  194.     f[u] = timee;
  195.     timee++;
  196. }
  197.  
  198. void DFS()
  199. {
  200.     cout<<endl;
  201.     for(int i = 0; i < N; i++)
  202.     {
  203.         odwiedzony[i] = 0;
  204.         prev[i] = -1;
  205.     }
  206.     for(int i = 0; i < N; i++)
  207.         if(odwiedzony[i] == 0)
  208.         {
  209.             cout<<i<<" ";
  210.             visit(i);
  211.         }
  212.  
  213. }
  214.  
  215. //DFS DLA LIST SASIEDZTWA
  216. void visit2(int u)
  217. {
  218.     lista *p;
  219.     odwiedzony[u] = 1;
  220.     p = lista_sasiedztwa[u];
  221.     for(int i = 0; i < N; i++)
  222.         if(p && odwiedzony[p->id]==0)
  223.         {
  224.             cout<<p->id<<" ";
  225.             odwiedzony[p->id] = 1;
  226.             visit2(p->id);
  227.             cout<<endl;
  228.         }
  229.         else if(p && odwiedzony[p->id] == 1)
  230.                 p = p->next;
  231. }
  232.  
  233. void DFS2()
  234. {
  235.     cout<<endl;
  236.     for(int i = 0; i < N; i++)
  237.         odwiedzony[i] = 0;
  238.     for(int i = 0; i < N; i++)
  239.         if(odwiedzony[i] == 0)
  240.         {
  241.             cout<<i<<" ";
  242.             visit2(i);
  243.         }
  244.  
  245. }
  246.  
  247. int d[N];
  248. void relax(int u, int v)
  249. {
  250.     if(d[v] > d[u] + waga[u][v])
  251.         d[v] = d[u] + waga[u][v];
  252. }
  253.  
  254. void dijkstra(int s)
  255. {
  256.     for(int i = 0; i < N; i++)
  257.     {
  258.         d[i] = 100000;
  259.         Q.push(i);
  260.     }
  261.     d[s] = 0;
  262.     while(!Q.empty())
  263.     {
  264.         int u = Q.front();
  265.         Q.pop();
  266.         for(int i = 0; i < N; i++)
  267.             if(graf[u][i] == 1)
  268.                 relax(u, i);
  269.     }
  270.     for(int i = 0; i < N; i++)
  271.     {
  272.         cout<<"["<<i<<"] "<<d[i]<<endl;
  273.     }
  274. }
  275.  
  276.  
  277. //DLA GRAFU NIESKIEROWANEGO WPISYWANIE WYPISYWANIE I ALG PRIMA
  278. int graf2[N][N];
  279. int waga2[N][N];
  280.  
  281. void wpisz2()
  282. {
  283.     srand (time(NULL));
  284.     for(int i = 0; i < N; i++)
  285.         for(int j = i+1; j < N; j++)
  286.         {
  287.             graf2[i][j] = rand() % 2;
  288.             graf2[j][i] = graf2[i][j];
  289.         }
  290. }
  291.  
  292. void losuj_waga2()
  293. {
  294.     srand (time(NULL));
  295.     for(int i = 0; i < N; i++)
  296.         for(int j = i+1; j < N; j++)
  297.             if(graf2[i][j] == 1)
  298.             {
  299.                 waga2[i][j] = rand()%10 + 1;
  300.                 waga2[j][i] = waga2[i][j];
  301.             }
  302.  
  303. }
  304.  
  305. void drukuj2()
  306. {
  307.     for(int i = 0; i < N; i++)
  308.     {
  309.         for(int j = 0; j < N; j++)
  310.             cout<< graf2[i][j]<<" ";
  311.         cout<<endl;
  312.     }
  313.     cout<<endl<<endl;
  314.     for(int i = 0; i < N; i++)
  315.     {
  316.         for(int j = 0; j < N; j++)
  317.             cout<< waga2[i][j]<<" ";
  318.         cout<<endl;
  319.     }
  320. }
  321.  
  322. int key[N];
  323. int pi[N];
  324. bool czy_nalezy[N];
  325.  
  326. void prim(int r)
  327. {
  328.     for(int i = 0; i < N; i++)
  329.     {
  330.         czy_nalezy[i] = true;
  331.         Q.push(i);
  332.         if(i != r)
  333.             key[i] =  10000;
  334.     }
  335.     key[r] = 0;
  336.     pi[r] = NULL;
  337.     czy_nalezy[r] = false;
  338.     while(!Q.empty())
  339.     {
  340.         int u = Q.front();
  341.         Q.pop();
  342.  
  343.         for(int v = u+1; v < N; v++)
  344.         {
  345.             if(graf2[u][v] == 1 && czy_nalezy[v] == true && waga2[u][v] < key[v])
  346.             {
  347.                 pi[v] = u;
  348.                 key[v] = waga2[u][v];
  349.             }
  350.         }
  351.         czy_nalezy[u] = false;
  352.     }
  353.     cout<<endl;
  354.     cout<<"[pi]: ";
  355.     for(int i = 0; i < N; i++)
  356.         cout<<pi[i]<< " ";
  357.     cout<<endl;
  358.     cout<<"[key]: ";
  359.     for(int i = 0; i < N; i++)
  360.         cout<<key[i]<<" ";
  361. }
  362.  
  363. int main(){
  364.     //wpisz();
  365.     //losuj_waga();
  366.     //drukuj();
  367.     //dijkstra(0);
  368.     //tworz_liste();
  369.     //DFS();
  370.     //DFS2();
  371.  
  372.     wpisz2();
  373.     losuj_waga2();
  374.     drukuj2();
  375.     prim(0);
  376.     return 0;
  377. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement