您的位置:首页 > 其它

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

2017-07-27 16:25 15 查看
第一个接触到的东西是迪杰斯特拉算法。

网上的教程都有各种指针,但是我对指针一点都不了解啦

下面这个代码是一个没有指针的最简单的过程。

我要加很多注释了防止下次自己又要重新学一遍

//一个可以求出从起点到任一点距离的程序
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐