单源最短路径问题

我们以{起点,终点,长度}三元组来表示有向图中两个节点之间的距离关系,则上图可以表示为:

{{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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值