prim算法和Dijkstra算法都是图论或者离散数学里面的典型算法,由于两者在实现策略上有很多相似之处,现做以比较:
同:
(1)、两者都属于贪心算法的应用;
(2)、都使用了堆结构;
(3)、都有松弛操作;
异:
(1)、给一堆村子之间修路,保证花费最小,用prim算法;
从一个村子到其他所有村子修路,并且希望花费最小,用Dijkstra。
(2)、prim适用于无相连通图;Dijkstra则适用于有向图;
(3)、松弛条件不一样:prim是从S到V-S进行松弛(V是所有节点集合,S是加入最小生成树的集合);而Dijkstra的松弛操作是从单源点到其他所有节点的松弛。
Prim算法:
数据结构:
int[] adjvex = new int[MAXVEX];//每一个节点的邻接节点
int[] lowcost = new int[MAXVEX];//当前S到V-S的最短开销
松弛操作:
if(lowcost[j] != 0 && G.arc[k][j] < lowcost[j]){
lowcost[j] = G.arc[k][j];
adjvex[j] = k;
}
代码:
package graph;
public class prim {
static final int INF = 9999;
static final int MAXVEX = 9;
class MGraph{
int numVertexes = 9;
private int[][] arc = {
{
0,10,INF,INF,INF,11,INF,INF,INF},
{
10,0,18,INF,INF,INF,16,INF,12},
{INF,INF,0,22,INF,INF,INF,INF