最短路径——Dijkstra和Floyd算法


简介

求最短路径的目的不必多说。通过设置权值,可以获取图中使用时间最短路径、途经路程最短路径等。

求最短路径的两种算法:

  1. 迪杰斯特拉算法 DIjkstra
  2. 弗洛伊德算法 Floyd

二者的主要区别在于:
Dijkstra仅求解一个顶点到其余顶点的最短路径;Floyd求解所有顶点到其余顶点的最短路径。
Dijistra的复杂度为O(n2),Floyd的复杂度为O(n3),但Floyd算法简洁优美,非常好看。

提示:下附代码,亲测可用


1. Dijkstra算法

思想类似与最小生成树中的Prim算法。先贪心求最小值,再获取迭代权值数组,如此迭代。
代码如下:

#include "iostream"
using namespace std;
#define MAX 1000
#define N 10
typedef struct {
   
    int vnum;
    int anum;
    int vertex[N];
    int edge[N][N];
}MGraph;
void CreateGraph(MGraph& G, int vnum, int v[9], int a[9][9])
{
   
    G.vnum = vnum;
    G.anum = vnum * vnum;
    for (int i = 0; i < vnum; i++)
    {
   
        G.vertex[i] = v[i];
    }
    for (int i = 0; i < vnum; i++)
    {
   
        for (int j = 0; j < vnum; j++)
        {
   
            G.edge[i][j] = a[i][j];
        }
    }
    return;
}

typedef int Patharc[9];
typedef int ShortPathTable[9];
void ShortestPath_Dijkstra(MGraph& G, int v0, Patharc* P, ShortPathTable* D)
{
   
    int v, w, k, min;
    int final[9];
    for (v = 0; v < G.vnum; v++)
    {
   
        final[v] = 0;
        (*D)[v] = G.edge[v0][v];
        (*P)[v] = 0;
    }
    (*D)[v0] = 0;
    final[v0] = 1;

    for (v = 1; v < G.vnum; v++)
    {
   
        min = 65535;
        for (w = 0; w < G.vnum; w++)
        {
   
            if (!final[w] and (*D)[w] < min)
            {
   
                k = w;
                min = (*D)[w];
            }
        }
        final[k] = 1;
        cout << "D: ";
        for (int i = 0; i < G.vnum; i++)
        {
   
            cout << (*D)[i] << " ";
        }
        cout << endl;
        cout << "min: " << min << endl;

        for (w = 0; w < G.vnum; w++)
        {
   
            if (!final[w] and (min + G.edge[k][w] < (*D)[w]))
            {
   
                (*D)[w] = min + G.edge[k][w];
                (*P)[w] = k;
            }
        }
        cout << "P: ";
        for (int i = 0; i < G.vnum; i++)
        {
   
            cout << (*P)[i] << " ";
        }
        cout << endl;
    }
}
int main()
{
   
    MGraph G;
    int vnum = 9;
    int v[9] = {
   0, 1, 2, 3, 4, 5, 6, 7, 8};
    int a[9][9] = {
   0, 1, 5, 65535, 65535, 65535, 65535, 65535, 65535,
                   1, 0, 3, 7, 5, 65535, 65535, 65535, 65535,
                   5, 3, 0, 65535, 1, 7, 65535, 65535, 65535,
                   65535, 7, 65535, 0, 2, 65535, 3, 65535, 65535,
                   65535, 5, 1, 2, 0, 3, 6, 9, 65535,
                   65535, 65535, 7, 65535, 3, 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值