Graphen - · PDF fileGerichtete Graphen Definition 0.3 Ein gerichteter Graph (directed...

download Graphen -   · PDF fileGerichtete Graphen Definition 0.3 Ein gerichteter Graph (directed graph, digraph) ist ein Graph, in dem jede Kante eine Richtung hat. Fur¨ u,v ∈ V ist

If you can't read please download the document

Transcript of Graphen - · PDF fileGerichtete Graphen Definition 0.3 Ein gerichteter Graph (directed...

  • 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