一个求两点之间最短距的帖子

第一个接触到的东西是迪杰斯特拉算法。
网上的教程都有各种指针,但是我对指针一点都不了解啦
下面这个代码是一个没有指针的最简单的过程。
我要加很多注释了防止下次自己又要重新学一遍

//一个可以求出从起点到任一点距离的程序
#include"iostream"
#include"string.h"                                 //还记得这个吗memset的头文件记得加.h
using namespace std;


int map[1000][1000];                               //记录每两点之间的距离信息
int pos;                                           //标记运行到哪个位置
int visited[1000];                        //判断是否访问过(每次循环只改变一个点而不是一条路径)
int low[1000];//the lowest length;                 //每点距离起始点的距离

void work(int n)
{
    int Max = 9999999;

    memset(visited, 0, sizeof(visited));           //memset赋值的时候有要求的不可以什么值都赋
    for (int i = 0; i < 1000; i++)
        low[i] = Max;                   //先将每个点与起始点的距离设置为最大值(方便更新时比较)

    map[1][1] = 0;                                 //修改起始点的信息
    visited[1] = 1;

    for (int i = 1; i <= n; i++)
    {
        low[i] = map[1][i];                  //先将与起始点相邻的点与存入各点与起始点距离的数组
    }

    for (int p = 1; p <= n; p++)
    {
        pos = 1;                                  //将pos指向起始点
        int min = Max;                            //先将最短距离设置为最大值(方便比较)
        for (int i = 1; i <= n; i++)
        {
            if (min > low[i] && visited[i] == 0)
            {
                min = low[i];                 //寻找第一层与起始点相邻点中距离最短的那个并标记
                pos = i;
            }
        }
        visited[pos] = 1;                        //将此点设置为已访问的点

        for (int i = 1; i <= n; i++)
        {
            if (visited[i] == 0 && map[pos][i] + low[pos] < low[i])
            {
                low[i] = map[pos][i] + low[pos];

                //这步一定要理解啊喂!可以理解为把第一层中最近的那个点
                //相邻的最近点直接连在low中连到了起始点,打通任督二脉
                //的骚操作
                //所以上面在比较的时候也要记得直接比较low而不是map!!在这里错了很久找不到原因!!
        }

    }

}

int main()
{
    int Max = 9999999;
    //cout << Max;
    //memset(map, , sizeof(map));

    for (int i = 0; i < 1000; i++)
        for (int j = 0; j < 1000; j++)
            map[i][j] = Max;
    //
    int n, m;//n is point m is the number of the road
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int x, y;
        cin >> x >> y;
        int length;
        cin >> length;
        map[x][y] = map[y][x] = length;
    }

//cin the message
    work(n);                                    //如果想设置任一点为起点可以将函数多传入一个值
    int a;
    while (cin >> a)
        cout << low[a];


    return 0;
}

上面写的时候太愚蠢了,改一下就可以成为从任意起点开始的程序

未完,还有几种方法没来得及看呢等看完补全啊哈

以下,完全相同的代码,是没有注释的方便复制版本嘿嘿我就是这么懒啦

//迪杰斯特拉算法
#include"iostream"
#include"string.h"
using namespace std;


int map[1000][1000];
int pos;
int visited[1000];
int low[1000];//the lowest length;

void work(int n)
{
    int Max = 9999999;

    memset(visited, 0, sizeof(visited));
    for (int i = 0; i < 1000; i++)
        low[i] = Max;

    map[1][1] = 0;
    visited[1] = 1;

    for (int i = 1; i <= n; i++)
    {
        low[i] = map[1][i];
    }

    for (int p = 1; p <= n; p++)
    {
        pos = 1;
        int min = Max;
        for (int i = 1; i <= n; i++)
        {
            if (min > low[i] && visited[i] == 0)
            {
                min = low[i];
                pos = i;
            }
        }
        visited[pos] = 1;

        for (int i = 1; i <= n; i++)
        {
            if (visited[i] == 0 && map[pos][i] + low[pos] < low[i])
            {
                low[i] = map[pos][i] + low[pos];
            }
        }

    }

}

int main()
{
    int Max = 9999999;
    //cout << Max;
    //memset(map, , sizeof(map));

    for (int i = 0; i < 1000; i++)
        for (int j = 0; j < 1000; j++)
            map[i][j] = Max;
    //
    int n, m;//n is point m is the number of the road
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int x, y;
        cin >> x >> y;
        int length;
        cin >> length;
        map[x][y] = map[y][x] = length;
    }

//cin the message
    work(n);
    int a;
    while (cin >> a)
        cout << low[a];


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值