定義圖和路徑結構:
#define vex 4 //頂點數
#define infinty 1000 //沒有路徑
#define undescide -1 //下一跳節點未定
typedef struct __shortpathtable
shortpathtable;
typedef struct __mygraph
mygraph;
演算法過程:
void shortestpath_dij(mygraph *graph, int v0, shortpathtable *path)
else
}vexflag[v0] = 1;//標記起始點
for(count = 1; count < graph->vexnum; count++)
}vexflag[index] = 1;//標記具有最小弧的節點,加入到最短路徑中
//更新最短路徑
for(i = 0; i < graph->vexnum; i++)
}} }
}void printshortestpath(shortpathtable *path, int src, int dst)
}while(node != src);
printf("從%d到達%d的最短路徑長度是%d, 路徑是:", src, dst, path[dst].arc);
printf("%d", src);
for(i -= 2; i >= 0; i--)
printf("\n");
}int main()
} graph.vexnum = vex;
shortestpath_dij(&graph, 3, path);
printshortestpath(path, 3, 0);
printshortestpath(path, 3, 1);
printshortestpath(path, 3, 2);
}
測試:
測試圖為
測試結果:
定義圖和路徑結構:
#define vex 4 //頂點數
#define infinty 1000 //沒有路徑
#define undescide -1 //下一跳節點未定
typedef struct __shortpathtable
shortpathtable;
typedef struct __mygraph
mygraph;
演算法過程:
void shortestpath_floyd(mygraph *graph, shortpathtable path[vex])
else
}} //計算最短路徑
for(i = 0; i < graph->vexnum; i++)
}} }
}void printshortestpath(mygraph *graph, shortpathtable path[vex])
printf("\n"); }}
void findshortestpath(mygraph *graph, shortpathtable path[vex])
dst = j;
nexthop = i;
count = 0;
while(nexthop != dst && nexthop != undescide)
if(nexthop == undescide)
printf("%d 到 %d 的最短路徑是: %d->", i, j, i);
for(m = 0; m < count - 1; m++)
printf("%d\n", j);
} printf("\n"); }}
int main()
} graph.vexnum = vex;
shortestpath_floyd(&graph, path);
printshortestpath(&graph, path);
findshortestpath(&graph, path);
}
測試:
圖結構同dijkstra
結果為:
Dijkstra最短路徑演算法
基本思路是 選擇出發點相鄰的所有節點中,權最小的乙個,將它的路徑設定為確定。其他節點的路徑需要儲存起來。然後從剛剛確認的那個節點的相鄰節點,算得那些節點的路徑長。然後從所有未確定的節點中選擇乙個路徑最短的設定為確定。重複上面步驟即可。void dijkstra graph g,string v fl...
Dijkstra最短路徑演算法
引入 dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。package dijkstra p...
最短路徑 Dijkstra演算法
最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...