# Dijkstra Algorithmus initialisieren



## gamma21 (17. Apr 2019)

Ich möchte den Djikstra Algorithmus verwenden um den kürzesten Weg in einem Graph zu finden.
Ich habe bereits Funktionen die mir die Koordinaten der jeweiligen Knoten zurück gibt so wie eine Funktion die mir die Gewichtung der Kanten (der euklidische Abstand) zurück gibt. Eine ArrayList gibt mir die ID der Nachbarknoten zurück und ein eine Funktion die Anzahl der Knoten.
So weit so gut.
Im ersten Schritt des Djikstra Algorithmus werden ja nun alle Abstände zum Startknoten auf unendlich gesetzt. 

```
public static double dijkstra(Graph G, Integer o, Integer p, ArrayList<Integer> Queue Q) {
        
        for(int i = 1; i<G.Knotenanzahl;i++)
        {

            G.weight(o,i) = 9999999;
        }
            }
}
```
Ich bekomme nun die Fehlermeldung:
`Error: unexpected type required: variable found:  value`
Warum kann ich auf diese Art keinen Wert zuweißen?


----------



## Robat (17. Apr 2019)

Weil weight nunmal einen Wert zurück gibt und keine Variable im eigentlichen Sinne.
Schreib dir lieber eine Methode um den Wert zu setzen (Setter). Sowas wie `g.setWeight(i,o,99999);`


----------



## JCODA (17. Apr 2019)

Zudem ist deine Parameterliste etwas durcheinander gekommen, immer Typ, dann ein Bezeichner, soll Q vom Typ Queue oder Arraylist sein?


----------



## gamma21 (18. Apr 2019)

> Schreib dir lieber eine Methode um den Wert zu setzen


Die Funktionen sind alle gegeben, d.h ich kann diese nicht verändern. weight besitzt scheinbar keine Setter Methode, jedoch die   ArrayList<Integer>Nachbarknoten(int v). Diese retourniert eine Liste von IDs der Nachbarknoten.  Kann ich darüber die Distanz der Nachbarknoten auf unendlich setzten?

```
for(int i = 1; i<G.Knotenzahl()-1;i++)
        {
        G.Nachbarknoten(i).set(9999,i);
        }
        return 0.0;
    }
```
Dies würde ja nur die ID ändern, jedoch nicht den Abstand.
Seht ihr das auch so?


> soll Q vom Typ Queue oder Arraylist sein?


Q soll vom Typ Queue sein.


----------



## gamma21 (18. Apr 2019)

Nun mal angenommen, ich hätte die Distanz somit auf unendlich gesetzt, weiß ich nun nicht mehr wie es weiter gehen soll:

```
while(!Q.istleer())
        {
            int x = Q.entferneMin();
            for(int i = 1; i<G.Knotenzahl()-1;i++)
            {
                if(G.enthältKanten(o,i))
                {
                    Q.add(i,G.weight(o,i));
                }
            }
        }
```
Nun habe ich allerdings nur das Gewicht der Kante in meine Queue aufgenommen, nicht den Knoten selbst. Wie kann ich also diesen in die Queue aufnehmen oder ist das gar nicht notwendig?


----------

