Example #1
0
 private static void DetermineGrades(Graph g)
 {
     foreach (Vertex v in g.Vertices()) // fuer jeden Knoten
     {
         foreach (Edge e in v.edges)    // fuer jeden Nachbarknoten
         {
             e.dest.indegree++;         // erhoehe seinen Eingangsgrad um 1
         }
     }
 }
Example #2
0
 private static void InitalizeAllNodes(Graph g, Dictionary <Vertex, bool> dictAlleKnotenImGraph)
 {
     foreach (Vertex v in g.Vertices())
     {                    // fuer jeden Knoten
         v.indegree = 0;  // setze seinen Eingangsgrad auf 0
         v.nr       = -1; // vergib ungueltige Nummer
         if (!dictAlleKnotenImGraph.ContainsKey(v))
         {
             dictAlleKnotenImGraph.Add(v, true);
         }
     }
 }
Example #3
0
        private static bool DoTopologicalSorting(Graph g, Dictionary <long, int?> result, Dictionary <Vertex, bool> allVerticesInGraph, ref int stufeKnoten)
        {
            List <Vertex> l = new List <Vertex>(); // Liste von Knoten, die inzwischen den Eingangsgrad 0 haben

            bool MindEinEingangsGradNull = false;

            foreach (Vertex v in g.Vertices()) // jeden Knoten mit Eingangsgrad 0
            {
                if (v.indegree == 0)
                {
                    l.Add(v); // fuege hinten in die Liste ein
                    if (!result.ContainsKey(v.key))
                    {
                        result.Add(v.key, stufeKnoten);
                    }
                    MindEinEingangsGradNull = true;
                    allVerticesInGraph.Remove(v);
                }
            }
            if (!MindEinEingangsGradNull)
            {
                foreach (Vertex w in allVerticesInGraph.Keys)
                {
                    w.zirkelBestandteil = true;
                }
            }

            int     id           = 0; // initialisiere Laufnummer
            Boolean stufeErhoeht = false;

            stufeKnoten++;
            while (!(l.Count == 0))
            {
                if (stufeErhoeht)
                {
                    stufeKnoten++;
                }
                stufeErhoeht = false;
                // solange Liste nicht leer
                Vertex v = l[0]; // besorge und entferne Kopf aus Liste
                l.RemoveAt(0);
                v.nr = id++;     // vergib naechste Nummer
                allVerticesInGraph.Remove(v);

                MindEinEingangsGradNull = false;
                foreach (Edge e in v.edges) // fuer jede ausgehende Kante
                {
                    Vertex w = e.dest;      // betrachte den zugehoerigen Knoten
                    w.indegree--;           // erniedrige seinen Eingangsgrad
                    if (w.indegree == 0)
                    {                       // falls der Eingangsgrad auf 0 sinkt
                        MindEinEingangsGradNull = true;
                        stufeErhoeht            = true;
                        l.Add(w); // fuege Knoten hinten in Liste ein
                        if (!result.ContainsKey(w.key))
                        {
                            result.Add(w.key, stufeKnoten);
                        }
                    }
                }
            }

            return(MindEinEingangsGradNull);
        }