Gerichteter Baum mit Kantenmarkierung
In vielen Graphenalgorithmen werden gerichtete Bäume erzeugt, so etwa bei der Breitensuche, bei der Berechnung eines minimalen Spannbaums oder bei der Berechnung der kürzesten Wege in einem Graphen.
Als Grundlage hierfür dient die folgende Klasse RootedTree; diese stellt die erforderliche Datenstruktur sowie entsprechende Methoden zur Verfügung.
Ein gerichteter Baum wird durch eine Knotenmarkierung repräsentiert, die jedem Knoten seinen eindeutig bestimmten Vorgänger zuordnet. Der Vorgänger der Wurzel ist der nicht vorhandene Knoten -1, denn die Wurzel des Baums hat keinen Vorgänger.
Wir benutzen Marker, um zu jedem Knoten den Vorgänger zu speichern, ferner auch um die Entfernung des Knotens, z.B. zum Vorgänger, zu speichern. Ein weiterer Marker dient dazu, während der Berechnung des Baums diejenigen Knoten zu kennzeichnen, die schon zum Baum hinzugehören.
public class RootedTree
{
protected int n;
protected Marker<Integer> pred;
protected Marker<Double> dist;
protected BooleanMarker tree;
public RootedTree(int n_)
{
n=n_;
pred=new Marker<Integer>(n, -1);
dist=new Marker<Double>(n, Double.POSITIVE_INFINITY);
tree=new BooleanMarker(n);
}
public void setDistance(int v, double w)
{
dist.setMark(v, w);
}
public double getDistance(int v)
{
return dist.getMark(v);
}
public void setPredecessor(int v, int u)
{
pred.setMark(v, u);
}
public int getPredecessor(int v)
{
return pred.getMark(v);
}
public void toTree(int v)
{
tree.mark(v);
}
public boolean inTree(int v)
{
return tree.isMarked(v);
}
public boolean hasPredecessor(int v)
{
return getPredecessor(v)!=-1;
}
public double getWeight()
{
double sum=0;
for (int v=0; v<n; v++)
sum+=getDistance(v);
return sum;
}
public ArrayList<Integer> getPathTo(int v)
{
ArrayList<Integer> p=new ArrayList<Integer>();
while (v!=-1)
{
p.add(0, v);
v=getPredecessor(v);
}
return p;
}
public WeightedUndirectedGraph getTree()
{
WeightedUndirectedGraph t=new WeightedUndirectedGraph(n);
for (int v=0; v<n; v++)
if (hasPredecessor(v))
t.setWeight(getPredecessor(v), v, getDistance(v));
return t;
}
}
Weiter mit:
[up]
H.W. Lang mail@hwlang.de Impressum Datenschutz
Created: 17.09.2012 Updated: 20.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden