gpt4 book ai didi

Java:我的 Prim 看起来怎么样?

转载 作者:太空宇宙 更新时间:2023-11-04 08:57:45 26 4
gpt4 key购买 nike

我正在尝试使用 JGraphT 实现 Prim 的最小生成树算法。看起来怎么样?

我遇到的一个问题是 JGraphT 按照指示处理所有事情。因此,有时需要进行一些尴尬的调用来反转 g.getEdgeSource(e)g.getEdgeTarget(e)(如果它们碰巧不正确)。

我最初尝试使用 JGraphT 的斐波那契堆来实现这一点,但它太难了,所以我只是做了一个常规的 PQ。

我没有将不存在的边的权重设置为无穷大,而是没有将其添加到队列中。

建议?风格问题?明显的低效率?我应该使用代码而不是自己编写代码?

public static Graph<String, DefaultWeightedEdge> primPQ(final WeightedGraph<String, DefaultWeightedEdge> g, String root) {
Graph<String, DefaultWeightedEdge> mst = new SimpleWeightedGraph<String, DefaultWeightedEdge>(DefaultWeightedEdge.class);
Queue<DefaultWeightedEdge> pq = new PriorityQueue<DefaultWeightedEdge>(g.vertexSet().size(), new Comparator<DefaultWeightedEdge>() {
@Override
public int compare(DefaultWeightedEdge o1, DefaultWeightedEdge o2) {
if (g.getEdgeWeight(o1) < g.getEdgeWeight(o2)) {
return -1;
}
if (g.getEdgeWeight(o1) > g.getEdgeWeight(o2)) {
return 1;
}
return 0;
}
});

mst.addVertex(root);
DefaultWeightedEdge link;

for (String v : g.vertexSet()) {
link = g.getEdge(root, v);
if (link != null) {
pq.add(link);
}
}

//this is made difficult by JGraphT's assumption that everything is directed
DefaultWeightedEdge minEdge = pq.poll();
String toAdd;
String alreadyFound;
String tmp;

while (minEdge != null) {
// guessing at which is in the MST
toAdd = g.getEdgeTarget(minEdge);
alreadyFound = g.getEdgeSource(minEdge);

if (!(mst.containsVertex(toAdd) && mst.containsVertex(alreadyFound))) {
// swap if backwards
if (mst.containsVertex(toAdd)) {
tmp = toAdd;
toAdd = alreadyFound;
alreadyFound = tmp;
}
mst.addVertex(toAdd);
mst.addEdge(alreadyFound, toAdd, minEdge);
System.out.format("%s --> %s\n", g.getEdgeSource(minEdge), toAdd);

for (String v : g.vertexSet()) {
if (! mst.containsVertex(v)) {
link = g.getEdge(toAdd, v);
if (pq.contains(link)) {
g.setEdgeWeight(minEdge, Math.min(g.getEdgeWeight(minEdge), g.getEdgeWeight(link)));
}
if (link != null && ! pq.contains(link)) {
pq.add(link);
}
}
}
}
minEdge = pq.poll();
}
return mst;
}

最佳答案

我已经将你的算法的结果与我的一个作业进行了比较,它们都给出了相同的最小总权重,继续保持!

关于Java:我的 Prim 看起来怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1786946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com