Example #1
0
        /// <summary>
        /// Searches all connected vertices from the source by BFS.
        /// </summary>
        /// <param name="source">First Vertice to be search</param>
        public string BuscaEmLargura(int source)
        {
            int    count   = 0;
            string out_put = "";

            int[] num = new int[Vertices.Count];

            for (int n = 0; n < Vertices.Count; n++)
            {
                num[n] = -1;
            }

            Queue <int> fila = new Queue <int>();

            num[source] = count++;

            fila.Enqueue(source);

            while (fila.Count > 0)
            {
                var vertex = fila.Dequeue();
                out_put += BuscaVertice(vertex).Label;

                foreach (var n in Adj.get_Adj()[vertex])
                {
                    if (num[n] == -1)
                    {
                        num[n] = count++;
                        fila.Enqueue(n);
                    }
                }
            }
            fila.Clear();
            return(out_put);
        }
Example #2
0
 public bool VillageCheck()
 {
     if (Empty)
     {
         return(false);
     }
     return(Adj.All(r => r.Empty));
 }
Example #3
0
 /// <summary>
 /// Adds Aresta into Grafo
 /// </summary>
 /// <param name="a">TODO</param>
 /// <returns></returns>
 public bool RemoveAresta(Aresta a)
 {
     if (a.isDirected == isDigraph)
     {
         Arestas.Remove(a);
         Adj.remove_adj(a);
     }
     return(false);
 }
Example #4
0
        public override bool DeleteVertex(Vertex <TVertex> vertex) //TODO: delete all edges
        {
            int i;

            for (i = 0; i < Adj.Count; i++)
            {
                if (Adj[i].AdjIndex == vertex.Index)
                {
                    break;
                }
            }

            if (i == Adj.Count && Adj[i].AdjIndex != vertex.Index)
            {
                return(false); //не нашли вершину
            }
            if (Oriented)      //если ориентированный, удаляем список, проходим по всем спискам в поисках ребер
            {
                EdgesCount = EdgesCount - Adj[i].Length;
                Adj.Remove(Adj[i]);                 //удалили вершину
                for (int j = 0; j < Adj.Count; j++) //ищем и удаляем ребра
                {
                    for (var q = Adj[j].Head; q != null; q = q.Next)
                    {
                        if (q == null)
                        {
                            break;
                        }
                        // Adj[i].DeleteNode(q.AdjEdge.Vertex1, vertex);
                        //Adj[i].DeleteNode(q.AdjEdge.Vertex2, vertex);
                        DeleteEdge(q.AdjEdge.Vertex1, vertex);
                        //  DeleteEdge(q.AdjEdge.Vertex2, vertex);
                    }
                    // Adj[j].DeleteNode(vertex);
                }
                Vertexes.Remove(vertex);
                return(true);
            }
            else //если неориентированный, удаляем обратные ребра, потом удаляем строчку
            {
                for (var q = Adj[i].Head; q != null; q = q.Next)
                {
                    if (q == null)
                    {
                        break;
                    }

                    DeleteEdge(q.AdjEdge.Vertex1, q.AdjEdge.Vertex2); //удаляем ребра
                    // DeleteEdge(q.AdjEdge.Vertex2, q.AdjEdge.Vertex1);
                }
                Adj.Remove(Adj[i]);
                Vertexes.Remove(vertex);
                return(true);
            }
        }
Example #5
0
        /// <summary>
        /// GrauMédio
        /// </summary>
        /// <returns></returns>
        public double GrauMedio()
        {
            int n   = NumVertices();
            int sum = 0;

            for (int i = 0; i < n; i++)
            {
                sum += Adj.get_Adj()[i].Count;
            }
            return(sum / n);
        }
Example #6
0
    /**
     * Get the neighboring GameObject by named position
     **/
    Tile GetAdjacent(Adj pos)
    {
        var adjRow = Row;
        var adjCol = Col;

        if (pos == Adj.Left)
        {
            adjCol = Col - 1;
        }
        else if (pos == Adj.TopLeft)
        {
            adjCol = Col - 1;
            adjRow = Row + 1;
        }
        else if (pos == Adj.Top)
        {
            adjRow = Row + 1;
        }
        else if (pos == Adj.TopRight)
        {
            adjCol = Col + 1;
            adjRow = Row + 1;
        }
        else if (pos == Adj.Right)
        {
            adjCol = Col + 1;
        }
        else if (pos == Adj.BottomRight)
        {
            adjCol = Col + 1;
            adjRow = Row - 1;
        }
        else if (pos == Adj.Bottom)
        {
            adjRow = Row - 1;
        }
        else if (pos == Adj.BottomLeft)
        {
            adjRow = Row - 1;
            adjCol = Col - 1;
        }

        // Now that we have the right row/col for the desired neighbor
        // Make sure that it actually exists, otherwise return null
        if (valid(adjRow) && valid(adjCol))
        {
            return(boardCreator.Grid[adjRow][adjCol].GetComponent <Tile>());
        }
        else
        {
            return(null);
        }
    }
Example #7
0
        public override Vertex <TVertex> AddVertex() //добавление вершины
        {
            var v = new Vertex <TVertex>();

            v.Index = CurrentIndex;
            Vertexes.Add(v);
            var A = new AdjList <TVertex, TEdge, TData, TWeight>();

            A.AdjIndex = CurrentIndex;
            Adj.Add(A);
            CurrentIndex++;
            return(v);
        }
Example #8
0
        /// <summary>
        /// Recursive search by depth.
        /// </summary>
        /// <param name="v"></param>
        /// <param name="visited"></param>
        protected void DFS_search(int v, bool[] visited, Action action)//TODO
        {
            visited[v] = true;
            action();

            foreach (var n in Adj.get_Adj()[v])
            {
                if (!visited[n])
                {
                    DFS_search(n, visited, action);
                }
            }
        }
Example #9
0
 public bool IsValidOrigin()
 {
     // Valid origin regions are
     // 1) Not empty
     // 2) Not already villages
     // 3a) Have fewer than 7 huts, or
     // 3b) Have the same number or fewer huts than a neighbor
     if (Empty || Village)
     {
         return(false);
     }
     if (Huts.Sum() < 7 || Huts.Sum() <= Adj.Max(r => r.Huts.Sum()))
     {
         return(true);
     }
     return(false);
 }
Example #10
0
    class Kruskal : ShortestPath {//TODO:test,
        public long Run()
        {
            var L = Adj.Select((l, i) => Tuple.Create(i, l[i].Item1, l[i].Item2)).OrderBy(t => t.Item3).ToList();
            //var li = new List<Tuple<int, int, long>>();
            //I.REP(i =>{ foreach (var t in Adj[i]) li.Add(Tuple.Create(i, t.Item1, t.Item2));});
            //li = li.OrderBy(t => t.Item3).ToList();//li = li.OrderByDescending(t => t.Item3).ToList();
            var uf = new UnionFind(); uf.Init(V); long ret = 0;

            foreach (var t in L)
            {
                if (!uf.Same(t.Item1, t.Item2))
                {
                    ret += t.Item3; uf.Unite(t.Item1, t.Item2);
                }
            }
            return(ret);
        }
Example #11
0
        /// <summary>
        /// Returns the number of components from Graph
        /// </summary>
        /// <returns></returns>
        public int NumComponents()
        {
            bool[] marked = new bool[Vertices.Count];
            Adj.Update(this);
            int count = 0;

            for (int i = 0; i < Vertices.Count; i++)
            {
                marked[i] = false;
            }

            for (int j = 0; j < Vertices.Count; j++)
            {
                if (!marked[j])
                {
                    DFS_search(j, marked, () => { });
                    count++;
                }
            }
            return(count);
        }
Example #12
0
        /// <summary>
        /// Adds Aresta into Grafo
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        public bool AddAresta(Aresta a)
        {
            if (a.isDirected == isDigraph)
            {
                if (!Vertices.Contains(a.vertice1))
                {
                    Vertices.Add(a.vertice1);
                }

                if (!Vertices.Contains(a.vertice2))
                {
                    Vertices.Add(a.vertice2);
                }

                Arestas.Add(a);

                if (a.vertice1._id == a.vertice2._id)
                {
                    isAciclic = false;                                   // no longer aciclic
                }
                Adj.Update(this);
            }
            return(false);
        }
Example #13
0
 /// <summary>
 /// Adds Vertice into Grafo.
 /// </summary>
 /// <param name="v"></param>
 public void AddVertice(Vertice v)
 {
     Vertices.Add(v);
     Adj.Update(this);
 }
Example #14
0
 /// <summary>
 /// Overload, creates new Vertice from id and lbl.
 /// </summary>
 /// <param name="id"></param>
 /// <param name="lbl"></param>
 public void AddVertice(int id, string lbl)
 {
     Vertices.Add(new Vertice(lbl, id));
     Adj.Update(this);
 }
Example #15
0
 /// <summary>
 /// Removes Vertice from Grafo.
 /// </summary>
 /// <param name="v"></param>
 public void RemoveVertice(Vertice v)
 {
     Adj.Clear_adj(v, this);
     Vertices.Remove(v);
 }
Example #16
0
 /// <summary>
 /// AdjList to string
 /// </summary>
 /// <returns></returns>
 public string AdjListToString()
 {
     return(Adj.ToString());
 }
Example #17
0
 public void AddAdj(Region region)
 {
     Adj.Add(region);
 }