最短路径(Dijkstra and Floyd)

看了一个下午的资料才明白迪杰斯特拉算法,关键是网上的好多解释太拗口了。弗洛伊达好明白。

迪杰斯特算法主要思想就是把顶点分为两组,一组是求出最短路径的,另一组是没求出的(第二组)。然后选择从源点到第二组中某个顶点路径最短的那个点,把它加入第一组(其实这个时候以那个点的最短路径就已经确定了),一直这样下去,直到加入了所有的点(i=1~n)。


为什么说加入了第一组就已经确定了最短路径了? 这样想,从源点到这个点的路径通过比较后确定是最短的,因为图无负的权值,那就不可能找到任何一个中转点使得路径更短了。

其实要有图就更好理解,为了不侵权就不放图了。

代码不重要,关键要理解这个过程。

for(int i=1; i

{

min=MAXINT;

for(int w=0;w

if(!s[w]&&D[w]

{

v=w; min=D[w];

}

s[v]=true;  //找到了那个点v,把它加入第一组

for(int w=0;w

if(!s[w]&&(D[v]+G.arcs[v][w]

{

D[w]=D[v]+G.arcs[v][w];

}

}


写完这个过程之后,感觉思路更清晰了一点。


任意2个点的最短路径,可以反复用迪杰斯特,但用floyd会更简洁。

主要思想是一直加点。

for(int k=0;k

for(int i=0;i

for(int j=0;j

if(D[i][k]+D[k][j]

{

D[i][j]=D[i][k]+D[k][j];

}


呃,我其实在想,其实用floyd来实现迪杰斯特那样的问题也行吧,是不是说把第二个for循环去掉,再改一改就行了呢?现在有点忙,自己还不太想去弄。

你可能感兴趣的:(数据结构)