• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Algorytm Bellmana-Forda

VPS Starter Arubacloud
0 głosów
592 wizyt
pytanie zadane 10 maja 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)
#include <cstdlib> 
#include <fstream>
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
#define MAX 99999
void BellmanFord(int, int, int**);
void wyswietl(int ,int**);
void wyswietl_BellmanFord(int*, int*, int, int);
 
int main()
{
 
    int l_wierzch; l_wierzch = 6;
 
    int wierzch_start =0;
    int ** macierz;
    macierz = new int * [l_wierzch];
    for(int i=0; i<l_wierzch; i++)
        macierz[i] = new int[l_wierzch];
 
    int macierz2[6][6]={{0, 5, 0, 0, 0, 0},
                    {0, 0, 0, 3, 9, 0},
                    {3,-4, 0, 0, 0, 0},
                    {0, 0, 0, 0, 3, 2},
                    {0 ,0 ,-1,0, 0,-5},
                    {9, 0, 8, 0, 0, 0},
                                  };
    for(int j=0; j<l_wierzch; j++)
    {
        for(int k=0; k<l_wierzch; k++)
        {
 
                macierz[j][k] = macierz2[j][k];
        }
    }
    //
    wyswietl(l_wierzch, macierz);
    cout << endl;
    BellmanFord(wierzch_start, l_wierzch, macierz);
 
    system("pause");
}
 
void wyswietl_BellmanFord(int * koszt, int * numer, int l_wierzch, int wierzch_start)
{
    int * S = new int [l_wierzch];              // tymczasowy stos
    int sptr = 0;
    cout << "wyniki dla start: " << wierzch_start << endl;
    cout <<"End: " << " Dist: " <<  "Path: " << endl;
    for(int i=0; i<l_wierzch; i++)
    {
        cout.width(3);
        cout << i<< " |";
        cout.width(3);
        cout << koszt[i] <<"|   "; 
 
      for(int x = i; x!=-1; x = numer[x]) // umieszcz. wierzcholki na stosie
      {
        S[sptr++] = x;            // w kolejności od ostatniego do pierwszego
 
      while(sptr)                 // drukujemy w kolejnosci od konca odl
        cout<< S[--sptr] << " "; // 
 
      }
      cout << endl;
 
    }
}
void BellmanFord(int wierzch_start, int l_wierzch,int ** macierz)
{
    int * koszt = new int[l_wierzch];    //koszt dojscia
    int * numer    = new int[l_wierzch];    //i-ty numer wierzcholka grafu
    for(int i=0; i<l_wierzch; i++)    //ktory jest poprzednikiem wierz. i-tego na 
    {                                //na najkrotszej sciezce        
        numer[i] = -1;      //p      //domyslny numer
        koszt[i] = MAX; //d     //dimyslny koszt dotarcia (nieskonczonosc)
    }
    koszt[wierzch_start]=0; //koszt dotarcia z wierzcholka startowego do startowego
 
    //teraz petla glowna
for(int i=1; i<=l_wierzch; i++)
{
    for(int w=0; w<l_wierzch; w++)
    {
        for(int k=0; k<l_wierzch; k++)
        {
 
            if((macierz[w][k] !=0) && (koszt[k]) >= (koszt[w]+ macierz[w][k]))
                {
                    koszt[k] = koszt[w] + macierz[w][k];
                    numer[k] = w;
 
                }
 
        }
    }
 
}   
wyswietl_BellmanFord(koszt, numer, l_wierzch, wierzch_start);
}
 
void wyswietl(int l_wierzch, int ** macierz)
{
for(int j=0; j<l_wierzch; j++)
    {
        cout << endl;
        for(int k=0; k<l_wierzch; k++)
            cout << setw(3) << macierz[j][k];
     }
 
}

Działa poprawnie tylko dla dodatnic wartosci dla ujemnych wariuje ? Co zmienic lub dopisac ktoś pomoże?

komentarz 11 maja 2017 przez draghan VIP (106,230 p.)

Działa poprawnie tylko dla dodatnic wartosci dla ujemnych wariuje ?

Co znaczy "wariuje"? Masz zestaw przykładowych danych wejściowych i poprawnych danych wyjściowych?

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
4 odpowiedzi 366 wizyt
+1 głos
2 odpowiedzi 771 wizyt

92,980 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,309 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...