public bool AddEdge(MyGraphEdge edge) { if (!isPresent(edge.GetFrom()) || !isPresent(edge.GetTo())) { return(false); } int from = edge.GetFrom(); int to = edge.GetTo(); float cost = edge.GetCost(); if (m_DListNode.ContainsKey(from)) { m_DListNode[edge.GetFrom()].Add(new MyListGraphEdge(to, cost)); } else { m_DListNode.Add(from, new List <MyListGraphEdge>()); m_DListNode[from].Add(new MyListGraphEdge(to, cost)); } //// Nếu là đồ thị vô hướng thì thêm 1 cạnh ngược lại if (!this.m_bDigraph) { if (m_DListNode.ContainsKey(to)) { m_DListNode[to].Add(new MyListGraphEdge(from, cost)); } else { m_DListNode.Add(to, new List <MyListGraphEdge>()); m_DListNode[to].Add(new MyListGraphEdge(from, cost)); } } m_iNumEdge++; return(true); }
public bool AddEdge(MyGraphEdge edge) { if (!isPresent(edge.GetFrom()) || !isPresent(edge.GetTo())) { return false; } int from = edge.GetFrom(); int to = edge.GetTo(); float cost = edge.GetCost(); if (m_DListNode.ContainsKey(from)) { m_DListNode[edge.GetFrom()].Add(new MyListGraphEdge(to, cost)); } else { m_DListNode.Add(from, new List<MyListGraphEdge>()); m_DListNode[from].Add(new MyListGraphEdge(to, cost)); } //// Nếu là đồ thị vô hướng thì thêm 1 cạnh ngược lại if (!this.m_bDigraph) { if (m_DListNode.ContainsKey(to)) { m_DListNode[to].Add(new MyListGraphEdge(from, cost)); } else { m_DListNode.Add(to, new List<MyListGraphEdge>()); m_DListNode[to].Add(new MyListGraphEdge(from, cost)); } } m_iNumEdge++; return true; }
/// <summary> /// Tìm cây khung có trọng số nhỏ nhất /// </summary> /// <returns></returns> public MyListGraph PrimAlgo(MyGraphNode startNode) { MyListGraph result = new MyListGraph(this.m_bDigraph); List <int> p_fNodes = new List <int>(); List <MyGraphEdge> p_fEdges = new List <MyGraphEdge>(); p_fNodes.Add(startNode.getIndex()); while (p_fEdges.Count < this.m_Nodes.Count) { MyGraphEdge edge = PrimFindEdge(p_fNodes, p_fEdges); if (edge != null) { p_fNodes.Add(edge.GetTo()); p_fEdges.Add(edge); } else { // Đồ thị không liên thông break; } } for (int i = 0; i < p_fNodes.Count; i++) { result.AddNode(new MyGraphNode(p_fNodes[i])); } for (int i = 0; i < p_fEdges.Count; i++) { result.AddEdge(p_fEdges[i]); } return(result); }