奥普瓯江 发表于 2023-4-28 16:35:38

最小生成树-迪杰斯特拉(Dijkstra)算法

原理:




备注:





算法:
#include <stdio.h>
#include <stdlib.h>

#define MAX 65535
#define E 5

int dis = {{0, 2, 4, 7, MAX},{2, 0, 1, MAX, 2},{4, 1, 0, 1, 6},{7, MAX, 1, 0, MAX},{MAX, 2, 6, MAX, 0}};
int main()
{

    int W = {MAX, MAX, MAX, MAX, MAX};
    int D = 0, S = 0;

    for(int i = 0; i < E - 1; i++)
    {
      W = 0;                               //当每一个以执行后的数组赋值为0

      for(int j = 0; j < E; j++)             //第一个循环,这个循环主要是用于比较和向W数组中赋值用的
      {
            if(W != 0 && j != S)             //如果W不等于0,同时j 不等于S及执行该判断
            {
               if(W == MAX || W > D + dis)    //当W数组中的数等于MAX最大值的时候就执行该判断或者W数组大于传导节点的数值加上传导节点这一行中最小的数值及执行该判断
                {
                  W = D + dis;                   //将传导节点中的数值D加上在dis数组中传导节点这一行中最小的值赋值给W
                }
            }
      }

      D = MAX;                              //从新对D节点赋值因为上面的循环所用到的第一次循环D的赋值是O下面的循环其中的判断if(D > W)的意思是在本次循环中找到W数组中最小的值并将他赋给D如果不赋值MAX那0就是最小的值该程序无法执行

      for(int l = 0; l < E; l++)             //再次进行循环赛选出W数组中最小的值并将数组中的数值以及下标分别传给D和S以备上一个循环使用
      {
            if(W != 0 && W != MAX)
            {
                if(D > W)
                {
                  D = W;                   //数组中的值赋给D

                  S = l;                      //下标赋给l
                }
            }
      }

      printf("%d ", W);
    }

    return 0;
}


输出结果:

yinda_peng 发表于 2023-4-28 20:41:57

离散数学的内容

yinda_peng 发表于 2023-4-28 20:42:50

本质就是贪心,加了一个无回路的条件

奥普瓯江 发表于 2023-5-11 14:35:41

yinda_peng 发表于 2023-4-28 20:42
本质就是贪心,加了一个无回路的条件

嗯嗯是的,最简单的方法得出了不一样的效果
页: [1]
查看完整版本: 最小生成树-迪杰斯特拉(Dijkstra)算法