我们以{起点,终点,长度}三元组来表示有向图中两个节点之间的距离关系,则上图可以表示为:
{{1,2,9},{1,3,7},{1,4,3},{1,5,2},{2,6,4},{2,7,2},{2,8,1},{3,6,2},{3,7,7},{4,8,11},{5,7,11},{5,8,8},{6,9,6},{6,10,5},{7,9,4},{7,10,3},{8,10,5},{8,11,6},{9,12,4},{10,12,2},{11,12,5}}
用动态规划法求节点1到节点12的最短距离。
#include <stdio.h>
#include <limits.h>
#define NUM_NODES 12
int main() {
int edges[][3] = {
{1, 2, 9}, {1, 3, 7}, {1, 4, 3}, {1, 5, 2},
{2, 6, 4}, {2, 7, 2}, {2, 8, 1}, {3, 6, 2},
{3, 7, 7}, {4, 8, 11}, {5, 7, 11}, {5, 8, 8},
{6, 9, 6}, {6, 10, 5}, {7, 9, 4}, {7, 10, 3},
{8, 10, 5}, {8, 11, 6}, {9, 12, 4}, {10, 12, 2},
{11, 12, 5}
};
int num_edges = sizeof(edges) / sizeof(edges[0]);
int dist[NUM_NODES][NUM_NODES];
for (int i = 0; i < NUM_NODES; i++) {
for (int j = 0; j < NUM_NODES; j++) {
if (i == j) {
dist[i][j] = 0;
}
else {
dist[i][j] = INT_MAX;
}
}
}
for (int i = 0; i < num_edges; i++) {
int start = edges[i][0] - 1;
int end = edges[i][1] - 1;
int weight = edges[i][2];
dist[start][end] = weight;
}
for (int k = 0; k < NUM_NODES; k++) {
for (int i = 0; i < NUM_NODES; i++) {
for (int j = 0; j < NUM_NODES; j++) {
if (dist[i][k] != INT_MAX && dist[k][j] != INT_MAX && dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
printf("The shortest distance from node 1 to node 12 is: %d\n", dist[0][NUM_NODES - 1]);
return 0;
}