Ejemplo n.º 1
0
 /// <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);
         }
     }
 }
Ejemplo n.º 2
0
        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);
                }
            }
        }