Java编程:迪杰斯特拉算法(已知固定起点最短路径问题)

matrix[5] = new int[]{N, N, N, 4, 5, N, 6};

matrix[6] = new int[]{2, 3, N, N, 4, 6, N};

// 创建Graph

Graph graph = new Graph(vertex, matrix);

// 测试

graph.showGraph();

// 测试迪杰斯特拉算法

graph.dsj(6);

// 查看结果

graph.showDijkstra();

}

}

class Graph {

private char[] vertex; // 顶点数组

private int[][] matrix; // 邻接矩阵

private VisitedVertex vv; // 已经访问的结点集合

// 构造器

public Graph(char[] vertex, int[][] matrix) {

this.vertex = vertex;

this.matrix = matrix;

}

// 显示图的方法

public void showGraph() {

for (int[] link : matrix) {

System.out.println(Arrays.toString(link));

}

}

/**

  • 迪杰斯特拉算法实现

  • @param index 表示出发顶点对应的下标

*/

public void dsj(int index) {

vv = new VisitedVertex(vertex.length, index);

update(index); // 更新index顶点到周围顶点距离和前驱顶点

for (int i = 0; i < vertex.length; i++) {

index = vv.updateArr(); // 选择并返回新的访问顶点

update(index); // 更新index下标顶点到周围顶点的距离和周围顶点的前驱结点

}

}

// 更新index下标顶点到周围顶点的距离和周围顶点的前驱结点

private void

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迪杰斯特拉(Dijkstra's Algorithm)是一种用于寻找图中两点之间最短路径的算法,常用于解决单源最短路径问题。以下是迪杰斯特拉算法的C语言实现的基本步骤: ```c #include <stdio.h> #include <limits.h> #define V 9 // 图的顶点数 #define INF INT_MAX // 边的结构体表示 typedef struct { int src, dest, weight; } Edge; // 用于存储节点及其距离 typedef struct { int dist; int node; } Node; // 比较节点的距离 int compare(const void *a, const void *b) { return (*(Node *)a).dist - (*(Node *)b).dist; } // 迪杰斯特拉算法 void dijkstra(Edge edges[], int v, Node nodes[V]) { int i, u, minDistance; // 初始化所有节点为无限远,起点为0 for (i = 0; i < V; i++) nodes[i].dist = INF; nodes[v].dist = 0; // 将所有节点加入优先队列 qsort(nodes, V, sizeof(Node), compare); while (!IsEmpty(nodes)) { // 只有当队列不为空时 u = nodes[0].node; nodes.dist = INF; // 将当前节点标记为已处理 // 更新与其相邻节点的距离 for (i = 0; i < edges[u].dest; i++) { // 假设每个顶点有一条边到下一个顶点 if (nodes[edges[u].dest].dist > nodes[u].dist + edges[u].weight) { nodes[edges[u].dest].dist = nodes[u].dist + edges[u].weight; // 优先队列中的元素可能需要重新排序 InsertionSort(nodes, edges[u].dest); } } } // 打印结果 printf("Vertex \t\tDistance from Source\n"); for (i = 0; i < V; i++) printf("%d \t\t %d\n", i, nodes[i].dist); } // 辅助函数,判断队列是否为空 int IsEmpty(Node nodes[]) { return nodes.node == V; } // 辅助函数,对节点数组进行插入排序 void InsertionSort(Node nodes[], int k) { int i, j; Node temp; for (i = k; i > 0; i--) { if (nodes[i].dist > nodes[i - 1].dist) { temp = nodes[i]; nodes[i] = nodes[i - 1]; nodes[i - 1] = temp; } } } // 主函数调用 int main() { Edge edges[] = {{0, 1, 4}, {0, 7, 8}, {1, 2, 3}, {1, 6, 2}, {2, 3, 1}, {3, 4, 2}, {3, 5, 4}, {4, 6, 2}, {5, 6, 1}}; int v = 0; // 源点 Node nodes[V]; dijkstra(edges, v, nodes); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值