Dijkstra算法的C语言程序

Dijikstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。该算法是由荷兰计算机科学家迪杰斯特拉于1959年提出的。

程序来源:Dijkstra's Algorithm

百度百科:Dijkstra算法

维基百科:Dijkstra's Algorithm

C语言程序(去除了原文中非标准的C语言代码):

#include<stdio.h>

#define INFINITY 9999
#define MAX 10

void dijikstra(int G[MAX][MAX], int n, int startnode);

int main(){
    int G[MAX][MAX], i, j, n, u;

    printf("\nEnter the no. of vertices:: ");
    scanf("%d", &n);
    printf("\nEnter the adjacency matrix::\n");
    for(i=0;i < n;i++)
        for(j=0;j < n;j++)
            scanf("%d", &G[i][j]);
    printf("\nEnter the starting node:: ");
    scanf("%d", &u);
    dijikstra(G,n,u);
}

void dijikstra(int G[MAX][MAX], int n, int startnode)
{
    int cost[MAX][MAX], distance[MAX], pred[MAX];
    int visited[MAX], count, mindistance, nextnode, i,j;
    for(i=0;i < n;i++)
        for(j=0;j < n;j++)
            if(G[i][j]==0)
                cost[i][j]=INFINITY;
            else
                cost[i][j]=G[i][j];

    for(i=0;i< n;i++) {
        distance[i]=cost[startnode][i];
        pred[i]=startnode;
        visited[i]=0;
    }
    distance[startnode]=0;
    visited[startnode]=1;
    count=1;
    while(count < n-1) {
        mindistance=INFINITY;
        for(i=0;i < n;i++)
            if(distance[i] < mindistance&&!visited[i]) {
                mindistance=distance[i];
                nextnode=i;
            }
        visited[nextnode]=1;
        for(i=0;i < n;i++)
            if(!visited[i])
                if(mindistance+cost[nextnode][i] < distance[i]) {
                    distance[i]=mindistance+cost[nextnode][i];
                    pred[i]=nextnode;
                }
            count++;
    }

    for(i=0;i < n;i++)
        if(i!=startnode) {
            printf("\nDistance of %d = %d", i, distance[i]);
            printf("\nPath = %d", i);
            j=i;
            do {
                j=pred[j];
                printf(" <-%d", j);
            }
            while(j!=startnode);
        }
    printf("\n");
}

程序运行结果:

Enter the no. of vertices:: 4

Enter the adjacency matrix::
0 1 1 1
1 0 1 0
1 1 0 1
1 0 1 0

Enter the starting node:: 1

Distance of 0 = 1
Path = 0 <-1
Distance of 2 = 1
Path = 2 <-1
Distance of 3 = 2
Path = 3 <-0 <-1


  • 26
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
以下是Dijkstra算法C语言实现,其中包括了注释以方便理解: ```c #include <stdio.h> #include <limits.h> // 定义顶点数量 #define V 6 // 找到dist数组中最小值的索引 int minDistance(int dist[], bool sptSet[]) { int min = INT_MAX, min_index; for (int v = 0; v < V; v++) { if (sptSet[v] == false && dist[v] <= min) { min = dist[v], min_index = v; } } return min_index; } // 打印结果 void printSolution(int dist[]) { printf("Vertex \t Distance from Source\n"); for (int i = 0; i < V; i++) { printf("%d \t\t %d\n", i, dist[i]); } } // Dijkstra算法 void dijkstra(int graph[V][V], int src) { int dist[V]; // 存储从源点到各个顶点的最短距离 bool sptSet[V]; // 存储已经处理过的顶点 // 初始化所有距离为无穷大,所有顶点都未处理过 for (int i = 0; i < V; i++) { dist[i] = INT_MAX, sptSet[i] = false; } // 源点到自身的距离为0 dist[src] = 0; // 处理V-1个顶点 for (int count = 0; count < V - 1; count++) { // 找到dist数组中最小值的索引 int u = minDistance(dist, sptSet); // 标记该顶点已经处理过 sptSet[u] = true; // 更新dist数组中的值 for (int v = 0; v < V; v++) { if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; } } } // 打印结果 printSolution(dist); } int main() { // 定义邻接矩阵 int graph[V][V] = { {0, 4, 0, 0, 0, 0}, {4, 0, 8, 0, 0, 0}, {0, 8, 0, 7, 0, 4}, {0, 0, 7, 0, 9, 14}, {0, 0, 0, 9, 0, 10}, {0, 0, 4, 14, 10, 0} }; dijkstra(graph, 0); // 从顶点0开始执行Dijkstra算法 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值