我目前正在进行编程任务:给定一个大的加权未连接图(1 到目前为止我所得到的是将图形存储在AdjacencyList(Vector of Vector of IntegerPair,其中第一个整数是邻居,第二个是边缘的权重)。 我还使用Prim算法获得了最小生成树: 我现在所困扰的是如何找到从源到目的地的路径并在以下查询中返回最大权重边缘: 我被告知使用深度优先搜索来遍历生成的MST,但我认为DFS将遍历所有不在正确路径上的顶点(我是对的吗?)。以及如何找到最大边缘? (这个问题与任何SSSP算法无关,因为我没有被教过Dijstra等。)private static void process(int vtx) {
taken.set(vtx, true);
for (int j = 0; j < AdjList.get(vtx).size(); j++) {
IntegerPair v = AdjList.get(vtx).get(j);
if (!taken.get(v.first())) {
pq.offer(new IntegerPair(v.second(), v.first())); //sort by weight then by adjacent vertex
}
}
}
void PreProcess() {
Visited = new Vector<Boolean>();
taken = new Vector<Boolean>();
pq = new PriorityQueue<IntegerPair>();
taken.addAll(Collections.nCopies(V, false));
process(0);
int numTaken = 1;
int mst_cost = 0;
while (!pq.isEmpty() && numTaken != V) { //do this until all V vertices are taken (or E = V - 1 edges are taken)
IntegerPair front = pq.poll();
if (!taken.get(front.second())) { // we have not connected this vertex yet
mst_cost += front.first(); // add the weight of this edge
process(front.second());
numTaken++;
}
}
}
int Query(int source, int destination) {
int ans = 0;
return ans;
}
答案 0 :(得分:0)
一种可能的方法是使用Kruskal的MST算法。这是一个贪婪的算法,将从一个空图开始,重复添加不产生一个循环的最轻边。这满足了树的属性,同时确保了最小加权路径。
要查找最大加权边,您还可以使用算法的属性。既然你知道EdgeWeight(n)=&lt; EdgeWeight(n + 1),您添加到图表的最后一条边将是最大边。