迪杰斯特拉算法

迪杰斯特拉算法

基础

邻接矩阵(Adjacency Matrix)

本质:一个二维数组,邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵

对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0,有向图则不一定如此。
用邻接矩阵法表示图共需要n^2个空间,由于无向图的邻接矩阵一定具有对称关系,所以扣除对角线为零外,仅需要存储上三角形或下三角形的数据即可,因此仅需要n(n-1)/2个空间。

图转邻接矩阵

例子

这里写图片描述

本次以下图为例

这里写图片描述

根据程序提示生成矩阵并算出最短距离,以0点为起点,算到其他点最短距离

代码实现

#include <stdio.h>
#include <iostream>

const int MAX = 100;
const int INFINITE = 0xFFFFF;

void print_matrix(int n, int matrix[MAX][MAX]);
void main()
{
    int n, m; //点数和边数
    int matrix[MAX][MAX];
    int x, y, w;//两个点和之间的权值
    int dist[MAX]; //存放距离
    int flag[MAX]; //存放已找到最短距离的点
    int vx = 0; //起点
    int min;//最短距离
    int u, v; // vx --> u -->v
    printf("请输入顶点个数和边数,即除0和INF的点的个数,空格隔开\n");
    scanf_s("%d %d", &n, &m);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i==j)
            {
                matrix[i][j] = 0;
            }
            else
            {
                matrix[i][j] = INFINITE;
            }
        }
    }
    print_matrix(n, matrix);
    printf("请输入两个顶点和他们之间的权值,空格隔开\n");
    for (int j = 0; j < m; j++)
    {
        scanf_s("%d %d %d", &x, &y, &w);
        matrix[x][y] = w;
    }
    print_matrix(n, matrix);
    //查起点vx = 0到其他点的最短距离
    for (int i=0;i<n;i++)
    {
        flag[i] = 0;
        dist[i] = matrix[vx][i];
    }

    flag[vx] = 1; //起点到自己本身已获得最近距离为0
    for (int i=1;i<n;i++) //除去本身还剩n-1个所以从1开始,减少一次
    {
        min = INFINITE;
        for (int j=0;j<n;j++) //求当前dist数组中离第一个顶点距离最短的顶点的下标
        {
            if (!flag[j] && dist[j] < min)
            {
                min = dist[j];
                u = j;
            }
        }
        flag[u] = 1;
        //若找到其他途径比从vx号顶点直接到目的顶点的距离短,则替换掉
        for (int v=0;v<n;v++)
        {
            if (matrix[u][v]<INFINITE)
            {
                if (dist[v] > dist[u]+matrix[u][v])
                {
                    dist[v] = dist[u] + matrix[u][v];
                }
            }
        }
    }
    for (int i=0;i<n;i++)
    {
        printf("%d--->%d 最短距离:%d\n", vx, i, dist[i]);
    }
    system("pause");
}

void print_matrix(int n,int matrix[MAX][MAX])
{
    int i, j;
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

运行结果如图
这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值