hmmm najkrótszy to jest w tym 1. poscie..ciężko mi powiedzieć co dokładnie to może powodować
ale dzieje się to przy algorytmie dijkstry, zatem go wklejam (przy okazji mam drugie pytanie dlatego wkleje w calosci):
a wiec tutaj nie dziala: jest to algorytm dijkstry
felerne 2 linie oznaczyłem ########
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <iostream.h>
//!Wartość, od której przyjmujemy nieskończoność
#define nieskonczonosc 1000
using namespace std;
class cGraf{
public:
/*!Macierz przyległości, w indeksie (i,j) zawiera wartości:
0 dla i=j
nieskonczonosc jeśli nie istnieje krawędź (i,j)
K>0 waga krawędzi (i,j)
*/
int A[100][100];
/*!Wektor odległości od pierwszego wierzchołka do pozostałych,
początkowo zawiera pierwszy wiersz macierzy A
*/
int D[100];
//!Liczba wierzchołków grafu
int n;
//!Metoda wyznacza listę następników wierzchołka x
vector<int> Nastepniki(int x){
vector<int> wynik;
for (int i=0;i<n;i++)
if ((A[x][i]!=nieskonczonosc)&&(A[x][i]!=0))
wynik.push_back(i);
return(wynik);
}
};
class cWierzcholek{
public:
//!Wierzchołek
int V;
//!Odległość wierzchołka pierwszego do wierzchołka V
int Odl;
//!Przeciążamy operator mniejszości dla klasy cWierzcholek
friend bool operator < (const cWierzcholek &p1, const cWierzcholek &p2){
return(p1.Odl<p2.Odl);
}
};
void main(void)
{
FILE *plik;
char s[5];
int i,j,k;
cGraf Graf;
/*!Kolejka priorytetowa wierzchołków, uporządkowana wg klucza,
którym jest atrybut Odl klasy cWierzchołek
*/
vector<cWierzcholek> Q;
cWierzcholek wierzcholek;
//!Lista następników
vector<int> nastepniki;
//--------------------------------------------
if ((plik=fopen("graf.txt","r"))==NULL)
printf("Brak pliku graf.txt!\n"); else
{
//!Wczytujemy liczbęwierzchołków grafu
fscanf(plik,"%d",&Graf.n);
//!Wczytujemy dane do macierzy przyległości
for (j=0;j<Graf.n;j++)
for (i=0;i<Graf.n;i++)
{
fscanf(plik,"%s",s);
if (strcmp(s,"*")!=0)
Graf.A[j][i]=atoi(s); else Graf.A[j][i]=nieskonczonosc;
}
fclose(plik);
//!przyjmujemy, że wyznaczamy odległości od pierwszego wierzchołka w macierzy A
//!Tworzmy stóg
make_heap(Q.begin(),Q.end(),less<cWierzcholek>());
for (i=0;i<Graf.n;i++){
//!Początkowo wektor D zawiera pierwszy wiersz macierzy A
Graf.D[i]=Graf.A[0][i];
//!Dodaj dane z macierzy do kolejki Q
wierzcholek.V=i;
wierzcholek.Odl=Graf.A[0][i]; //w sumie to jest niepotrzebne bo i tak się nigdy tego nie używa
Q.insert(Q.begin(),wierzcholek);
}
vector<cWierzcholek>::iterator it;
//!Posortuj kolejkę Q
//#################TUTAJ#############
//jeżeli wyrzucimy pop_heap(...) to będzie zwracać złe wyniki a wedlug tego co mowisz powinno smigac.. (wg. mnie tez)
pop_heap(Q.begin(),Q.end());
sort_heap(Q.begin(),Q.end());
/*!Usuń pierwszy wierzchołek (odległość od pierwszego wierzchołka do pierwszego
wierzchołka wynosi 0
*/
cout << "przed Q.erase(Q.begin()); " << endl;
for(it = Q.begin();it!=Q.end();it++){
cout << "nr "<< (*it).V<< ") " << (*it).Odl << endl ;
}
cout << endl;
Q.erase(Q.begin());
cout << "po Q.erase(Q.begin()); " << endl;
for(it = Q.begin();it!=Q.end();it++){
cout << "nr " << (*it).V<< ") " << (*it).Odl << endl ;
}
cout << endl;
while (Q.empty()!=true){
//!Pobierz pierwszy wierzchołek z kolejki Q (ma on najmniejszą wartość klucza)
wierzcholek=Q[0];
//!Usuń go z kolejki
Q.erase(Q.begin());
cout << "po usunieciu 1. w while " << endl;
for(it = Q.begin();it!=Q.end();it++){
cout << (*it).Odl << " " ;
}
cout << endl;
//!Wyznacz listę jego następników
nastepniki=Graf.Nastepniki(wierzcholek.V);
cout << " rozpatruję wierzchołek nr " << wierzcholek.V << " waga " << Graf.D[wierzcholek.V];
cout << endl;
//!Dokonaj relaksacji odległości od wierzchołka pierwszego do każdego następnika z tej listy
for (i=0;i<nastepniki.size();i++)
Graf.D[nastepniki[i]]=min(Graf.D[nastepniki[i]],Graf.D[wierzcholek.V]+Graf.A[wierzcholek.V][nastepniki[i]]);
}
//!Wypisz wektor D zastępując wartość stałej nieskonczonosc znakiem *
k=nieskonczonosc;
for (i=0;i<Graf.n;i++)
if (Graf.D[i]<k)
printf("D(%i)=%d\n",i,Graf.D[i]);
else
printf("D(%i)=%s\n",i,"*");
}
printf("\nDowolny klawisz...\n");
getch();
return;
}
dodatkowo mam jeszcze jeden problem..
w petli while(Q.empty()!=true)
za kazdym razem powinno z tablicy Q pobierac wierzcholek i o aktualnie najmniejszym D[i] i go usuwac...
tutaj natomiast przed ta petla Q jest sortowane rosnaco a pozniej juz pobierane jest jak leci (dochodzi do tego, ze wierzcholki sa pobierane z Q w kolejnosci takiej, ze wierzcholek, ktory ma wieksze D[i] od innego zostanie pobrany przed nim...
mimo to algorytm dziala jednakze nie wiem czemu...
jest to algorytm ze strony
http://www.algorytm.org/index.php?option=com_content&task=view&id=93&Itemid=0
i nawet na niej w opisie algorytmu jest zapis
Pobierz ze zbioru Q wierzchołek v o najmniejszej wartości D[v] i usuń go ze zbioru.
czyli za kazdym razem powinien byc wyszukiwany wierzcholek o najmniejszej wartosci D[v].
Ktos wie dlaczego to dziala?
no i dlaczego nie dziala jak wywale pop_heap(...)
Pozdrawiam
Ka-lolek