View
231
Download
0
Category
Preview:
Citation preview
Graphen
Algorithmen und Datenstrukturen II 1
Terminologie
V : Menge von Knoten (auch Ecken, vertices or nodes)
E: Menge von Kanten (edges)
G: Graph G = (V,E)
Definition 0.1 Ein Graph ist eine Menge von Knoten und eine Menge von Kantendie Paare von Knoten verbinden.
Algorithmen und Datenstrukturen II 2
Benannte Graphen
Definition 0.2 Ein benannter Graph (labeled graph) ist ein Graph, in demKnoten und/oder Kanten mit Namen versehen sind.
Algorithmen und Datenstrukturen II 3
Algorithmen und Datenstrukturen II 4
Gerichtete Graphen
Definition 0.3 Ein gerichteter Graph (directed graph, digraph) ist ein Graph, indem jede Kante eine Richtung hat. Fur u, v V ist dann (u, v) 6= (v, u).
Algorithmen und Datenstrukturen II 5
Teilgraphen
Definition 0.4 Ein Teilgraph (subgraph) von (V,E) ist ein Paar (V , E), mitV V und E = {(u, v)|(u, v) E : u V , v V }.
Algorithmen und Datenstrukturen II 6
Algorithmen und Datenstrukturen II 7
Verbundene Graphen
Definition 0.5
Ein Graph heit verbunden (connected), wenn jeder Knoten von jedem anderenKnoten aus erreicht werden kann.
Ein Graph, der nicht verbunden ist, besteht aus einer Menge vonZusammenhangskomponenten (connected components), die maximal verbundeneTeilgraphen sind.
Algorithmen und Datenstrukturen II 8
Nachbarn
Definition 0.6 Zwei Knoten u, v V mit u 6= v heien benachbart (adjacent),wenn (u, v) E oder (v, u) E.
Algorithmen und Datenstrukturen II 9
Grad
Definition 0.7
ungerichtete Graphen: Der Grad eines Knotens ist die Zahl seiner Nachbarn.
gerichtete Graphen:Der Eingangsgrad (in-degree) eines Knotens v V ist die Zahl der Kanten(u, v) E.Der Ausgangsgrad (out-degree) eines Knotens v V ist die Zahl der Kanten(v, u) E.Der Grad ist die Summe von Eingangs- und Ausgangsgrad.
Algorithmen und Datenstrukturen II 10
Pfad
Definition 0.8 Ein Pfad (path) von u nach v ist einen Folge von Knotenu1, u2, . . . , uk, so da u1 = u und uk = v und (ui, ui+1) E fur alle 1 i < k.
Algorithmen und Datenstrukturen II 11
Zyklus
Definition 0.9 Ein Zyklus (cycle) ist ein Pfad, in dem Start- und Endknotenidentisch sind.
Algorithmen und Datenstrukturen II 12
Baume
Definition 0.10
Ein Baum (tree) ist ein ungerichteter, verbundener Graph ohne Zyklen (genauer:ohne Kreise, also Zyklen, in denen nur Anfangs- und Endpunkt identisch sind).
Eine Menge von Baumen heit Wald (forest).
Ein Spannbaum (spanning tree) eines verbundenen Graphen (V,E) ist einTeilgraph, der alle Knoten V enthalt und ein Baum ist.
Algorithmen und Datenstrukturen II 13
Algorithmen und Datenstrukturen II 14
Einige besondere Graphen
Gittergraph vollstandiger Graph bipartiter Graph
(grid graph) (complete graph) (bipartite graph)
Algorithmen und Datenstrukturen II 15
Anwendungen
Karten: Was ist der kurzeste Weg von Bielefeld nach Heidelberg? Was derschnellste Weg?
Hypertexts: Das ganze Web ist ein Graph
Schaltkreise: kreuzungsfreie Chip-Layouts
Zeitplane: Die Erledigung einiger Aufgaben hangt von der Erledigung anderer ab.Modellierung als gerichtete Kanten zwischen Aufgaben. Dann: Wie arbeiten wir
die Aufgaben am schnellsten ab?
Transaktionen: Telefonverbindungen (Optimierung von Telefonnetzen),Finanztransaktionen (Marktverstandnis)
Netzwerke: Computernetzwerke (Ausfallsicherheit), Proteininteraktions-Netzwerke
Algorithmen und Datenstrukturen II 16
Ein Abstrakter Datentyp (ADT) Graph
public interface Graph {
int V();
int E();
boolean directed();
void insert(Edge e);
void remove(Edge e);
boolean edge(Object v, Object w);
AdjList getAdjList(Object v);
}
Algorithmen und Datenstrukturen II 17
Adjazenzlisten
public interface AdjList {
int beg();
int nxt();
boolean end();
}
Anwendung:
AdjList iterator = G.getAdjList(1);
for (int v = iterator.beg(); !iterator.end(); v = iterator.nxt())
System.out.println("edge from 1 to " + v);
Algorithmen und Datenstrukturen II 18
Implementierung von Kanten
public class Edge {
int v, w;
public Edge(int v, int w) { this.v = v; this.w = w; }
}
Algorithmen und Datenstrukturen II 19
Eine graphverarbeitende Methode
public static Edge[] edges(Graph G) {
int E = 0;
Edge[] a = new Edge[G.E()];
for (int v = 0; v < G.V(); v++) {
AdjList A = G.getAdjList(v);
for (int w = A.beg(); !A.end(); w = A.nxt())
if (G.directed() || v < w)
a[E++] = new Edge(v, w);
}
return a;
}
Algorithmen und Datenstrukturen II 20
ADT GraphIO
public class GraphIO {
public static void scan(Graph G) throws IOException;
public static void show(Graph G);
}
Algorithmen und Datenstrukturen II 21
Graph-Eingabe
Algorithmen und Datenstrukturen II 22
public static void scan(Graph G) throws IOException {
int v, w;
StreamTokenizer st = new StreamTokenizer(new
BufferedReader(new
InputStreamReader(System.in)));
st.parseNumbers();
while (st.nextToken() != StreamTokenizer.TT_EOF) {
v = (int) st.nval;
if (st.nextToken() != StreamTokenizer.TT_EOF) {
w = (int) st.nval;
G.insert(new Edge(v,w));
}
else {
System.err.println("odd number of vertices. last one skipped.");
break;
}Algorithmen und Datenstrukturen II 23
}
}
Algorithmen und Datenstrukturen II 24
Graph-Ausgabe
public static void show(Graph G) {
for (int s = 0; s < G.V(); s++) {
System.out.print(s + ": ");
AdjList A = G.getAdjList(s);
for (int t = A.beg(); !A.end(); t = A.nxt())
System.out.print(t + " ");
System.out.println("");
}
}
Algorithmen und Datenstrukturen II 25
Zufalls-Graphen I
public static void randE(Graph G, int E) {
for (int i = 0; i < E; i++) {
int v = (int) (G.V()*Math.random());
int w = (int) (G.V()*Math.random());
G.insert(new Edge(v, w));
}
}
Algorithmen und Datenstrukturen II 26
Zufalls-Graphen II
public static void randG(Graph G, int E) {
double p = 2.0*E/G.V()/(G.V()-1);
for (int i = 0; i < G.V(); i++)
for (int j = 0; j < i; j++)
if (Math.random() < p)
G.insert(new Edge(i, j));
}
Die erwartete Anzahl Kanten ist E[G.E()] = E.
Algorithmen und Datenstrukturen II 27
Die Klasse IntGraph
Algorithmen und Datenstrukturen II 28
public abstract class IntGraph implements Graph {
protected int Vcnt, Ecnt;
protected boolean digraph;
public int V() { return Vcnt; }
public int E() { return Ecnt; }
public boolean directed() { return digraph; }
public abstract void insert(Edge e);
public abstract void remove(Edge e);
public abstract boolean edge(Object v, Object w);
public abstract AdjList getAdjList(Object v);
public static Edge[] edges(Graph G) {
Algorithmen und Datenstrukturen II 29
int E = 0;
Edge[] a = new Edge[G.E()];
for (int v = 0; v < G.V(); v++) {
AdjList A = G.getAdjList(v);
for (int w = A.beg(); !A.end(); w = A.nxt())
if (G.directed() || v < w)
a[E++] = new Edge(v, w);
}
return a;
}
public static void randE(Graph G, int E) {
for (int i = 0; i < E; i++) {
int v = (int) (G.V()*Math.random());
int w = (int) (G.V()*Math.random());
G.insert(new Edge(v, w));
}Algorithmen und Datenstrukturen II 30
}
public static void randG(Graph G, int E) {
double p = 2.0*E/G.V()/(G.V()-1);
for (int i = 0; i < G.V(); i++)
for (int j = 0; j < i; j++)
if (Math.random() < p)
G.insert(new Edge(i, j));
}
}
Algorithmen und Datenstrukturen II 31
Datenstruktur Adjazenzmatrizen
0 0 0 0
0 0 0 000000
0
0
0
0
0
0
0
0
0
0 0 0 0 0
10 1
1
1
11
1
10 0
0 0
0 0
9
8
7
6
5
4
3
2
1
0
0
0 0 0 0 0 0 0
0000000
0 0 0
0 0 0 0
0
000000
0
0 0
0 0 0 0 0
0000
000
0 0 0 0 0 0 0
000000
0
Algorithmen und Datenstrukturen II 32
Die Klasse AdjMatrixGraph
Algorithmen und Datenstrukturen II 33
public class AdjMatrixGraph extends IntGraph {
private boolean adj[][];
public AdjMatrixGraph(int V, boolean flag) {
Vcnt = V;
Ecnt = 0;
digraph = flag;
adj = new boolean[V][V];
}
public void insert(Edge e) {
int v = e.v, w = e.w;
if (!adj[v][w]) {
adj[v][w] = true;
if (!digraph) adj[w][v] = true;
Algorithmen und Datenstrukturen II 34
Ecnt++;
}
}
public void remove(Edge e) {
int v = e.v, w = e.w;
if (adj[v][w]) {
adj[v][w] = false;
if (!digraph) adj[w][v] = false;
Ecnt--;
}
}
public boolean edge(Object v, Object w) { return adj[(Integer) v][(Integer) w]; }
Algorithmen und Datenstrukturen II 35
private class AdjLinkedList implements AdjList {
private int i, v;
AdjLinkedList(in
Recommended