Java中邻接矩阵的最小生成树

时间:2010-12-14 14:35:55

标签: java minimum-spanning-tree

请帮助我理解如何从图的邻接矩阵中获取最小的生成树! 我在java写了关于它的课程,截止日期是16.12.2010,但我觉得它会失败。 现在我的程序可以:

  1. 绘制节点
  2. 画边
  3. 使用边缘权重在图纸的地下室生成图形的邻接矩阵
  4. 查找连接到节点的最小边缘
  5. 并有一些其他测试/测试功能
  6. 但我不知道如何在Java中实现Prim / Kruskal algorhythm。我试着找到一些结果 在谷歌,但只找到需要工作.obj文件的Java-applet,我也无法运行它。

    我编写了一些简单的控制台java pattern,它现在生成并打印图形的邻接矩阵。任何人都可以添加返回图的最小生成树的邻接矩阵的函数:

    public static int[][] mst(int[][] graph, int n) {
        ...
    }
    

    其中:

    • graph - 在n
    • 中生成图表
    • 顶点数量(节点)

    提前致谢!

2 个答案:

答案 0 :(得分:1)

鉴于你的程序目前无法处理不相交集数据结构,你可能想要使用Prim。

看到你已经完成了做Prim所需的大部分工作,我会用伪代码给你。

int bestDist[N]
int mst[N][N]
int cameHere[N]
bool done[N]
FOR i = 0..N-1:
 bestDist[i] = INFINITY
 done[i] = false
 FOR j=0..N-1:
  mst[i][j] = INFINITY

// start at any node
bestDist[0] = 0;
FOR i = 0..N-1:
 bestNode = INFINITY
 bestNodeDist = INFINITY

 IF bestNode != 0:
  mst[cameHere[bestNode]][bestNode] = graph[cameHere[bestNode]][bestNode]

 // find closest node
 FOR j= 0..N-1:
  IF !done[j] AND bestDist[j] < bestNodeDist:
   bestNode = j
   bestNodeDist = bestNodeDist[j]

 // update surrounding nodes
 FOR j=0..N-1:
  IF !done[j] AND bestNodeDist + graph[bestNode][j] < bestDist[j]:
   bestDist[j] = bestNodeDist + graph[bestNode][j]
   cameHere[j] = bestNode

return mst

这在O(N ^ 2)中运行但您可以在O(E log E)中运行,如果您使用堆,则E = num edge。

答案 1 :(得分:1)

如果有人正在寻找具有邻接矩阵实现的MST,那么我的示例代码是用Java编写的。我发布它是因为Junkbot的答案缺乏一些细节。它以O(n ^ 2)运行,因此Prim算法是查找MST的密集/完整图的最佳选择。

    public void MST-Prim()
    {
    int[] source = new int[numberOfVertices]; // i-th element contains number of source vertex for the edge with the lowest cost from tree T to vertex i
    double[] dist = new double[numberOfVertices]; //i-th element contains weight of minimal edge connecting i with source[i] 
    indicators = new boolean[numberOfVertices];  //if true, vertex i is in tree T

    // Mark all vertices as NOT being in the minimum spanning tree
    for (int i = 0; i < numberOfVertices; i++)
    {
        indicators[i] = false;
        dist[i] = Double.POSITIVE_INFINITY;
    }

     //we start with vertex number 0
    indicators[0] = true;
    dist[0] = 0;
    int bestNeighbour = 0;// lastly added vertex to the tree T 
    double minDist; 

    for (int i = 0; i < numberOfVertices - 1; i++)
    {
        minDist = Double.POSITIVE_INFINITY;

        for (int j = 0; j < numberOfVertices; j++) // fill dist[] based on distance to bestNeighbour vertex
        {
            if (!indicators[j])
            {
                double weight = fullGraph.getEdgeWeight(bestNeighbour, j);

                if (weight < dist[j])
                {
                    source[j] = bestNeighbour;
                    dist[j] = weight;
                }
            }
        }

        for (int j = 0; j < numberOfVertices; j++) // find index of min in dist[]
        {
            if (!indicators[j])
            {
                if (dist[j] < minDist)
                {
                    bestNeighbour = j;
                    minDist = dist[j];
                }
            }
        }

        if (bestNeighbour != 0)
        {//add the edge (bestNeighbour, dist[bestNeighbour]) to tree T
            addEdgeToTree(new GraphEdge(fullGraph.getNode(source[bestNeighbour]), fullGraph.getNode(bestNeighbour),
                    dist[bestNeighbour]));
            indicators[bestNeighbour] = true;
        }

    }

}