Dijkstra最短路径实现

Dijkstra算法类似prim算法,属于贪心算法。可以看prim这篇博客,原理是一样的。

c++代码实现:

数组表示

#include <bits/stdc++.h>
#define V 9

using namespace std;
//打印指定顶点到其他顶点的距离

int minDist(int *dist,int *set)
{
    int index,min = INT_MAX;
    for(int k = 0; k < V; k++)
    {
        if(!set[k] && min > dist[k])
        {
            index =  k;
            min = dist[k];
        }
    }
    return index;
}

void printV(int *dist)
{
    for(int i = 0; i < V; i++)
        cout << i << "  " << dist[i] << endl;
}

void dijkstra(int graph[V][V],int src)
{
    int dist[V];//存储最短距离
    int set[V];
    for(int i = 0; i < V; i++)
    {
        dist[i] = INT_MAX;
        set[i] = false;
    }
    dist[src] = 0;
    
    for(int i = 0; i < V-1; i++)
    {
        int idx = minDist(dist,set);
        set[idx] = true;

        for(int k = 0; k < V; k++)
            if(graph[idx][k] && !set[k] && dist[k] > graph[idx][k] + dist[idx] && dist[idx] != INT_MAX)
                dist[k] = dist[idx]+graph[idx][k];
    }

    printV(dist);
}

int main(void)
{

    int graph[V][V] = {{0, 4, 0, 0, 0, 0, 0, 8, 0},
                      {4, 0, 8, 0, 0, 0, 0, 11, 0},
                      {0, 8, 0, 7, 0, 4, 0, 0, 2},
                      {0, 0, 7, 0, 9, 14, 0, 0, 0},
                      {0, 0, 0, 9, 0, 10, 0, 0, 0},
                      {0, 0, 4, 14, 10, 0, 2, 0, 0},
                      {0, 0, 0, 0, 0, 2, 0, 1, 6},
                      {8, 11, 0, 0, 0, 0, 1, 0, 7},
                      {0, 0, 2, 0, 0, 0, 6, 7, 0}
                     };

    dijkstra(graph,0);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36607792/article/details/81292163
今日推荐