烦请各位高人帮忙讲解下Dijkstra算法

syhan 2006-01-02 02:17:47
用C#写了一个算法如下:
public void Dijkstra(int v1)
{
for (int i = 0; i < NodeList.Length; i++) //Nodelist.Length是这个图中顶点的大小
{
Dist[i] = Edge[v1, i]; //Edge[]是一个存放边的二维数组,Dist[]是用来存放顶点v1到其余顶点的最短路径的长度
S[i] = 0;
if (i != v1 && Dist[i] < MAXNUM) //maxnum是这个问题不会遇到的最大数
{
Path[i] = v1;//path存放最短路径上该顶点的前一顶点的顶点好
}
else
{
Path[i] = v1;
}
}
S[v1] = 1;
Dist[v1] = 0;

for (int i = 0; i < NodeList.Length - 1; i++)
{
int min = MAXNUM;
int u = v1;
for (int j = 0; j < NodeList.Length; j++)
{
if (S[j] != 0 && Dist[j] < min)
{
u = j;
min = Dist[j];
}
}
S[u] = 1;
for (int w = 0; w < NodeList.Length; w++)
{
if (S[w] != 0 && Edge[u, w] < MAXNUM && Dist[u] + Edge[u, w] < Dist[w])
{
Dist[w] = Dist[u] + Edge[u, w];
Path[w] = u;
}
}
}
}
按照我的理解来说,当我给出了这个函数的参数v1(就是说我给出要寻找一个顶点,例如说1)那么这个顶点到其他所有顶点的最短路径的长度都存在了Dist[]中,如果我要得到1到9的最短路径的值,那么我只要取出Dist[9]就可以了,大家说我的理解对吗?
可是在我的程序中这样做好像是不对的,取出来的这个值等于零,而当我求v1的相邻节点的最短路径时就是可以的,得到了正确结果1。
...全文
205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
syhan 2006-01-31
  • 打赏
  • 举报
回复
呵呵,这个问题我已经解决了,但是还是要感谢各位的热心解答

我的过程是这样子的:
我终于知道这个算法的问题所在了:
dijkstra算法本来是用来求解带权图的,我们知道,带权有向图的邻接矩阵是这样的,若两点间有路径,例如说1和9之间有路径,则Edge[1,9] = 1和9之间的权,若这两点之间无路径则为一个无穷大的值,就是这里的MAXNUM,即Edge[1,9] = MAXNUM。
而我则是用它来求解无权无向图,无权无向图的邻接矩阵赋值则不是上述所述,两点间无路径Edge[1,9] = 0,于是就出现问题了。

呵呵,我也是想了很长时间才想起来我到底哪里错了,不过还是要多些楼上的给与的耐心解答
zhenming_liu 2006-01-08
  • 打赏
  • 举报
回复
I think there are a few more ways to understand Dijkstra.

The first one is to apply the matroid model (Matroid implies greedy).
There are some brief introduction to matroid in "Introduction to Algorithms"

The second is to use the linear programming. It is very surprising that simplex algorithm gives an exactly the same solution to Dijkstra.

The third one (which may make the problem a lot more complicated) is to consider Dijkstra shortest path problem as a special case of minimum cost maximum flow problems.

Although many standard textbook propose to use a heap to store the distance information, it is also interesting to see that a normal binary tree will have the same performance (i.e. assymptotically).





mmmcd 2006-01-03
  • 打赏
  • 举报
回复
for (int j = 0; j < NodeList.Length; j++)
{
if (S[j] != 0 && Dist[j] < min)
{
u = j;
min = Dist[j];
}
}
此循环每次执行,u除了v1,取不到其他值
S[v1] = 1;
Dist[v1] = 0;
mengtiank 2006-01-02
  • 打赏
  • 举报
回复
Dijkstra基本思想是把图中所有顶点分成两组,第一组为已确定最短路经顶点集S,第二组为尚未确定最短路经的顶点集V-S,按最短路径长度递增的顺序逐个把第二组的顶点加到第一组去,直到从顶点v相互发可以到达的所有顶点都包括到第一组中。在这过程中,总保持从顶点v到第一组各顶点的最短路经长度都不大于从顶点v到第二组的任何顶点的最短路径长度。另外,每个顶点对应一个距离值,第一组的顶点对应的距离值就是从顶点v到此顶点的只包括第一组的顶点为中间顶点的最短路径长度
syhan 2006-01-02
  • 打赏
  • 举报
回复
简单的说就是这样的:

对于一个无向图生成的邻接举证,知道第A行和第B行(A<B),求ab的最短路径
syhan 2006-01-02
  • 打赏
  • 举报
回复
有一个地方写错了,大家看这个:
public void Dijkstra(int v1)
{
for (int i = 0; i < NodeList.Length; i++) //Nodelist.Length是这个图中顶点的大小
{
Dist[i] = Edge[v1, i]; //Edge[]是一个存放边的二维数组,Dist[]是用来存放顶点v1到其余顶点的最短路径的长度
S[i] = 0;
if (i != v1 && Dist[i] < MAXNUM) //maxnum是这个问题不会遇到的最大数
{
Path[i] = v1;//path存放最短路径上该顶点的前一顶点的顶点好
}
else
{
Path[i] = -1;
}
}
S[v1] = 1;
Dist[v1] = 0;

for (int i = 0; i < NodeList.Length - 1; i++)
{
int min = MAXNUM;
int u = v1;
for (int j = 0; j < NodeList.Length; j++)
{
if (S[j] != 0 && Dist[j] < min)
{
u = j;
min = Dist[j];
}
}
S[u] = 1;
for (int w = 0; w < NodeList.Length; w++)
{
if (S[w] != 0 && Edge[u, w] < MAXNUM && Dist[u] + Edge[u, w] < Dist[w])
{
Dist[w] = Dist[u] + Edge[u, w];
Path[w] = u;
}
}
}
}

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧