예제 #1
0
        private int getNeighborOrChild(int currentNode, bfsModel bfsItem, bool[] visitedNodes, int bfsId)
        {
            List <verticeModel> rt  = bfsItem.Vertices.FindAll(x => x.Destination == currentNode + 1 && visitedNodes[x.Source - 1]);
            verticeModel        rtv = rt.Min();

            if (rtv == null)
            {
                return(-1);
            }
            int sourceId = rtv.Source;

            List <verticeModel> children = getChildren(bfsId, sourceId - 1);
            int smallestDist             = int.MaxValue;
            int returnNode = -1;

            for (int i = 0; i < children.Count; i++)
            {
                if (!visitedNodes[children[i].Destination - 1] && children[i].Value < smallestDist)
                {
                    smallestDist = children[i].Value;
                    returnNode   = children[i].Destination - 1;
                }
            }
            return(returnNode);
        }
예제 #2
0
        private void getChildrenMarkParent(int currentNode, int bfsId, bfsModel bfsItem)
        {
            List <verticeModel> children     = getChildren(bfsId, currentNode);
            verticeModel        smallestDist = new verticeModel();

            smallestDist.Value = int.MaxValue;
            for (int childrenId = 0; childrenId < children.Count; childrenId++)
            {
                distances[children[childrenId].Destination - 1] = distances[currentNode] + children[childrenId].Value;
                if ((smallestDist == null || smallestDist.Value > children[childrenId].Value) &&
                    !visitedNodes[children[childrenId].Destination - 1])
                {
                    smallestDist = children[childrenId];
                }
            }
            visitedNodes[currentNode] = true;
            currentNode = getNeighborOrChild(currentNode, bfsItem, visitedNodes, bfsId);
            if (currentNode != -1)
            {
                getChildrenMarkParent(currentNode, bfsId, bfsItem);
            }
            else
            {
                currentNode = smallestDist.Destination - 1;
                if (currentNode != -1)
                {
                    getChildrenMarkParent(currentNode, bfsId, bfsItem);
                }
            }
        }
예제 #3
0
        private void BgBFS_DoWork(object sender, DoWorkEventArgs e)
        {
            /*
             * 1st: go foreach query
             * 2nd: create an array of nodes from 1 to count
             * 3rd: create an array for distance from 1 to count with values int.maxvalue
             * 4th: distance[source] value = 0
             * 5th: visit neighbors and assign values
             * 6th: visit each neighbors neighbors and assign values
             * */

            for (int bfsId = 0; bfsId < bfsItems.Count; bfsId++)
            {
                bfsModel query = bfsItems[bfsId];
                visitedNodes = new bool[query.Nodes];
                distances    = new int[query.Nodes];

                for (int i = 0; i < query.Nodes; i++)
                {
                    visitedNodes[i] = false;
                    distances[i]    = int.MaxValue;
                }

                distances[query.SourceNode - 1] = 0;
                int currentNode = query.SourceNode - 1;
                getChildrenMarkParent(currentNode, bfsId, query);
                distancesList.Add(distances);
            }
            e.Result = "Success";
        }
예제 #4
0
        private List <verticeModel> getChildren(int bfsItemId, int node)
        {
            List <int> children = new List <int>();

            bfsModel item = bfsItems[bfsItemId];

            return(item.Vertices.FindAll(x => x.Source == node + 1));
        }
예제 #5
0
 private void BtnAddNodesEdges_Click(object sender, EventArgs e)
 {
     if (txtNodesEdges.Text != "")
     {
         int      nodes = Convert.ToInt32(txtNodesEdges.Text.Split(' ')[0].Trim());
         int      edges = Convert.ToInt32(txtNodesEdges.Text.Split(' ')[1].Trim());
         bfsModel item  = new bfsModel();
         item.QueryId    = bfsItems.Count + 1;
         item.Nodes      = nodes;
         item.Edges      = edges;
         item.SourceNode = Convert.ToInt32(txtSourceNodeForQuery.Text.Trim());
         bfsItems.Add(item);
         lbNodesAndEdgesForQueries.Items.Add(string.Format("Query number {0}: Nodes {1} Edges {2}", item.QueryId, nodes, edges));
     }
     else
     {
         MessageBox.Show("Please write the Nodes and Edges for a query");
     }
 }