/// <summary> /// Trả về các cạnh kề với đỉnh /// </summary> /// <param name="start">Đỉnh xét</param> /// <returns>Null nếu đỉnh không có cạnh kề</returns> public EdgeCollection this[Node start] { get { EdgeCollection edgeCollection = new EdgeCollection(); foreach (Edge item in _list) { if (item.start == start) { edgeCollection.Add(item); } else if (item.IsUndirected && item.end == start) { edgeCollection.Add(item); } } if (edgeCollection.Count > 0) { return(edgeCollection); } else { return(null); } } }
public NodeCollection BFS(Node node) { Reset(); NodeCollection edges_result = null; if (n > 0) { edges_result = new NodeCollection(); edges_result.Add(node); Queue <Node> queue_nodes = new Queue <Node>(); queue_nodes.Enqueue(node); node.IsVisit = true; while (queue_nodes.Count > 0) { node = queue_nodes.Dequeue(); EdgeCollection edges = _edgeList[node]; if (edges != null) { foreach (Edge edge in edges) { Node node_them = edge.start == node ? edge.end : edge.start; if (!node_them.IsVisit) { node_them.IsVisit = true; queue_nodes.Enqueue(node_them); edges_result.Add(node_them); edge.IsSelected = true; } } } } } return(edges_result); }
void GetEdge_prime() { Edge edge = null; int min = 0; EdgeCollection edges = graphUI1.Data.GetAllEdgeFromNodes(nodes); string text = "Các cạnh xét :\r\n"; foreach (Edge item in edges) { text = text + item.ToString() + "\r\n"; item.IsSelected = true; if (min > item.weight || min == 0) { min = item.weight; edge = item; } } if (edge != null) { text += "Cạnh được chọn:\r\n"; text += edge.ToString() + "\r\n"; textBox.Text += text; graphUI1._list.Add(edge); edge.start.IsVisit = true; edge.end.IsVisit = true; nodes.Add(edge.start); nodes.Add(edge.end); } }
public List <NodeCollection> IsHaiPhia() { Reset(); NodeCollection phia1 = new NodeCollection(); NodeCollection phia2 = new NodeCollection(); NodeCollection T; bool falg = true; phia1.Add(_nodeList[0]); _nodeList[0].IsVisit = true; do { foreach (Node node in phia1) { EdgeCollection edges = _edgeList[node]; foreach (Edge edge in edges) { Node node_them = edge.start == node ? edge.end : edge.start; phia2.Add(node_them); } } T = new NodeCollection(); foreach (Node node in phia2) { EdgeCollection edges = _edgeList[node]; foreach (Edge edge in edges) { Node node_them = edge.start == node ? edge.end : edge.start; T.Add(node_them); } } if (T.Equal(phia1)) { break; } phia1 = T; if (NodeCollection.giao(phia1, phia2)) { falg = false; break; } }while (true); if (!falg) { return(null); } return(new List <NodeCollection>() { phia1, phia2 }); }
/// <summary> /// Tìm cây khung nhỏ nhất theo thuật toán Kruskal /// </summary> /// <param name="a">Mảng chứa danh sách kề</param> /// <param name="n">Số đỉnh</param> static void Kruskal(int[,] a, int n) { EdgeCollection list = matrix_edge_convert(a, n); list.Sort(); EdgeCollection listResult = new EdgeCollection(); //danh dau nhan i cho dinh i int[] label = new int[n]; for (int i = 0; i < n; i++) { label[i] = i; } int lab1 = 0; int lab2 = 0; foreach (Edge item in list) { if (label[item.start.Index] != label[item.end.Index]) { listResult.Add(item); if (label[item.start.Index] > label[item.end.Index]) { lab1 = label[item.end.Index]; lab2 = label[item.start.Index]; } else { lab2 = label[item.end.Index]; lab1 = label[item.start.Index]; } for (int i = 0; i < n; i++) { if (label[i] == lab2) { label[i] = lab1; } } } } foreach (Edge item in listResult) { Console.WriteLine(item.ToString()); } }
/// <summary> /// Tìm cây khung nhỏ nhất theo thuật toán Prim /// </summary> public EdgeCollection Prim(Node startNode = null) { Reset(); EdgeCollection listResult = new EdgeCollection(); if (startNode == null) { startNode = _nodeList[0]; } Node node = startNode; node.IsVisit = true; NodeCollection nodes = new NodeCollection(); nodes.Add(node); Edge edge = null; int min = 0; int n = 0; while (!_nodeList.IsAllVisit) { n++; min = 0; EdgeCollection edges = GetAllEdgeFromNodes(nodes); foreach (Edge item in edges) { if (min > item.weight || min == 0) { min = item.weight; edge = item; } } if (edge != null) { listResult.Add(edge); edge.start.IsVisit = true; edge.end.IsVisit = true; nodes.Add(edge.start); nodes.Add(edge.end); } } return(listResult); }
public EdgeCollection GetAllEdgeFromNodes(IEnumerable <Node> nodes) { EdgeCollection edgeCollection = new EdgeCollection(); foreach (Edge edge in _edgeList) { if (nodes.Contains(edge.start) && edge.start.IsVisit && !edge.end.IsVisit) { edgeCollection.Add(edge); } else { if (edge.IsUndirected && edge.end.IsVisit && !edge.start.IsVisit && nodes.Contains(edge.end)) { edgeCollection.Add(edge); } } } return(edgeCollection); }
/// <summary> /// Tìm cây khung nhỏ nhất theo thuật toán Krukal /// </summary> public EdgeCollection Kruskal() { Reset(); EdgeCollection listResult = new EdgeCollection(); _edgeList.Sort(); //danh dau nhan i cho dinh i int[] label = new int[n]; for (int i = 0; i < n; i++) { label[i] = i; } int lab1 = 0; int lab2 = 0; foreach (Edge item in _edgeList) { if (label[item.start.Index] != label[item.end.Index]) { listResult.Add(item); if (label[item.start.Index] > label[item.end.Index]) { lab1 = label[item.end.Index]; lab2 = label[item.start.Index]; } else { lab2 = label[item.end.Index]; lab1 = label[item.start.Index]; } for (int i = 0; i < n; i++) { if (label[i] == lab2) { label[i] = lab1; } } } } return(listResult); }
/// <summary> /// Chuyển ma trận kề về danh sách các cạnh /// </summary> /// <param name="a">ma trận kề</param> /// <param name="n">số đỉnh</param> /// <returns>Danh sách cạnh</returns> static EdgeCollection matrix_edge_convert(int[,] a, int n) { EdgeCollection listEdge = new EdgeCollection(); Edge edge; for (int i = 0; i < n; i++) { Node start = new Node(i); for (int j = i; j < n; j++) { if (a[i, j] > 0) { Node end = new Node(j); edge = new Edge(start, end, a[i, j]); listEdge.Add(edge); } } } // listEdge.Sort(); return(listEdge); }
void khoitao() { _edgeList = new EdgeCollection(); _nodeList = new NodeCollection(); this.IsUndirected = false; }
public void Prim(Node node) { _list = _graph.Prim(node); Invalidate(); }
public void Kruskal() { _list = _graph.Kruskal(); Invalidate(); }