?? algo7-6.cpp
字號:
// algo7-6.cpp 實現算法7.15的程序。迪杰斯特拉算法的實現
#include"c1.h"
#define MAX_NAME 5 // 頂點字符串的最大長度+1
#define MAX_INFO 20 // 相關信息字符串的最大長度+1
typedef int VRType;
typedef char InfoType;
typedef char VertexType[MAX_NAME];
#include"c7-1.h"
typedef int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef int ShortPathTable[MAX_VERTEX_NUM];
#include"bo7-1.cpp"
void ShortestPath_DIJ(MGraph G,int v0,PathMatrix &P,ShortPathTable &D)
{ // 用Dijkstra算法求有向網G的v0頂點到其余頂點v的最短路徑P[v]及帶權長度
// D[v]。若P[v][w]為TRUE,則w是從v0到v當前求得最短路徑上的頂點。
// final[v]為TRUE當且僅當v∈S,即已經求得從v0到v的最短路徑 算法7.15
int v,w,i,j,min;
Status final[MAX_VERTEX_NUM];
for(v=0;v<G.vexnum;++v)
{
final[v]=FALSE;
D[v]=G.arcs[v0][v].adj;
for(w=0;w<G.vexnum;++w)
P[v][w]=FALSE; // 設空路徑
if(D[v]<INFINITY)
{
P[v][v0]=TRUE;
P[v][v]=TRUE;
}
}
D[v0]=0;
final[v0]=TRUE; // 初始化,v0頂點屬于S集
for(i=1;i<G.vexnum;++i) // 其余G.vexnum-1個頂點
{ // 開始主循環,每次求得v0到某個v頂點的最短路徑,并加v到S集
min=INFINITY; // 當前所知離v0頂點的最近距離
for(w=0;w<G.vexnum;++w)
if(!final[w]) // w頂點在V-S中
if(D[w]<min)
{
v=w;
min=D[w];
} // w頂點離v0頂點更近
final[v]=TRUE; // 離v0頂點最近的v加入S集
for(w=0;w<G.vexnum;++w) // 更新當前最短路徑及距離
{
if(!final[w]&&min<INFINITY&&G.arcs[v][w].adj<INFINITY&&(min+G.arcs[v][w].adj<D[w]))
{ // 修改D[w]和P[w],w∈V-S
D[w]=min+G.arcs[v][w].adj;
for(j=0;j<G.vexnum;++j)
P[w][j]=P[v][j];
P[w][w]=TRUE;
}
}
}
}
void main()
{
int i,j,v0=0; // v0為源點
MGraph g;
PathMatrix p;
ShortPathTable d;
CreateDN(g);
ShortestPath_DIJ(g,v0,p,d);
printf("最短路徑數組p[i][j]如下:\n");
for(i=0;i<g.vexnum;++i)
{
for(j=0;j<g.vexnum;++j)
printf("%2d",p[i][j]);
printf("\n");
}
printf("%s到各頂點的最短路徑長度為:\n",g.vexs[0]);
for(i=1;i<g.vexnum;++i)
printf("%s-%s:%d\n",g.vexs[0],g.vexs[i],d[i]);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -