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); }
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); } } }
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"; }
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)); }
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"); } }