示例#1
0
        /* Menentukan level (kedalaman) tiap rumah dengan DFS.
         * Dimulai dari NomorRumah = 1 dan level = 0.
         */
        public static void TentukanLevel(int NomorRumah_dicari, int level, List <int> path, GraphKingdomMap graph)
        {
            foreach (var vert in graph.Vertices)
            {
                if (vert.NomorRumah == NomorRumah_dicari)
                {
                    if (!path.Contains <int>(vert.NomorRumah))
                    {
                        path.Add(vert.NomorRumah);
                    }

                    // menentukan level
                    vert.Level = level;

                    // cari tetangga yang belum dikunjungi
                    graph.TryGetOutEdges(vert, out IEnumerable <DataEdge> OutEdges);
                    int  i       = 0;
                    bool DeadEnd = true;
                    while ((i < OutEdges.Count()) && (DeadEnd))
                    {
                        if (!path.Contains(OutEdges.ElementAt <DataEdge>(i).Target.NomorRumah))
                        {
                            DeadEnd = false;
                            TentukanLevel(OutEdges.ElementAt <DataEdge>(i).Target.NomorRumah, level + 1, path, graph);
                        }
                        else
                        {
                            i++;
                        }
                    }
                    // jika tidak ada tentangga yang belum dikunjungi dan belum balik ke istana
                    if (level > 0)
                    {
                        foreach (var edge in OutEdges)
                        {
                            if (edge.Target.Level < level)
                            {
                                level = level - 1;
                                TentukanLevel(edge.Target.NomorRumah, level, path, graph);
                            }
                        }
                    }
                    // jika tidak ada tentangga yang belum dikunjungi dan sudah balik ke istana, berhenti
                    else
                    {
                        break;
                    }
                }
            }
        }
示例#2
0
        /* Melakukan DFS dari start hingga destination ditemukan. */
        public static void DFS(int startLevel, int start, int destination, List <int> route, GraphKingdomMap graph)
        {
            foreach (var vert in graph.Vertices)
            {
                // mencari NomorRumah dari daftar rumah
                if (vert.NomorRumah == start)
                {
                    // menambahkan rumah ke rute
                    route.Add(vert.NomorRumah);

                    // jika rumah = destination, method berakhir
                    if (vert.NomorRumah == destination)
                    {
                        break;
                    }

                    // cari tetangga rumah
                    graph.TryGetOutEdges(vert, out IEnumerable <DataEdge> OutEdges);
                    int  i       = 0;
                    bool DeadEnd = true;
                    while ((i < OutEdges.Count()) && (DeadEnd))
                    {
                        // mencari tujuan yang belum pernah dikunjungi dan bukan parent dari start
                        if ((!route.Contains(OutEdges.ElementAt <DataEdge>(i).Target.NomorRumah)) && (OutEdges.ElementAt <DataEdge>(i).Target.Level > startLevel))
                        {
                            DeadEnd = false;
                        }
                        else
                        {
                            i++;
                        }
                    }
                    // jika ditemukan tujuan, pindah ke tujuan
                    if (!DeadEnd)
                    {
                        DFS(startLevel, OutEdges.ElementAt <DataEdge>(i).Target.NomorRumah, destination, route, graph);
                    }
                    else
                    {
                        // jika tidak ditemukan tujuan dan belum kembali ke start
                        if (vert.Level > startLevel)
                        {
                            foreach (var edge in OutEdges)
                            {
                                // backtrack
                                if (edge.Target.Level < vert.Level)
                                {
                                    DFS(startLevel, edge.Target.NomorRumah, destination, route, graph);
                                }
                            }
                        }
                        // jika tidak ditemukan tujuan dan sudah kembali ke start, berhenti
                        else
                        {
                            route.RemoveAt(route.Count() - 1);
                            break;
                        }
                    }
                }
            }
        }