/// <summary> /// 深度优先遍历 /// </summary> /// <param name="v">要遍历的顶点</param> /// <param name="index">联通分量id</param> private void DFS(int v, int index) { visited[v] = index; foreach (var w in G.GetAdj(v)) { if (visited[w] == -1) { DFS(w, index); } } }
public Kruskal(WeightedGraph weightedGraph) { this.G = weightedGraph; CC cc = new CC(G); mst = new List <WeightedEdge>(); //只有联通分量为1时才能有最小生成树 if (cc.CCCount > 1) { return; } List <WeightedEdge> edges = new List <WeightedEdge>(); for (int i = 0; i < G.V; i++) { foreach (var j in G.GetAdj(i)) { if (i < j) { edges.Add(new WeightedEdge(i, j, G.GetWeight(i, j))); } } } edges.Sort(); UnionFind uf = new UnionFind(G.V); foreach (var edge in edges) { if (!uf.isConnected(edge.V, edge.W)) { uf.Union(edge.V, edge.W); mst.Add(edge); } } }