資源簡介
用c實現了求最短路徑情況,可根據需要自己適當修改程序,就可以用于求最小花費,最短時間等。
代碼片段和文件信息
/*輸入數據注意事項:
1,不要重復輸入相同結點之間但是不同的權重值。
2,權重值不要設為0
3,結點數不要小于4
//注意,程序求最短路徑的算法來自書本上的P181迪杰斯特拉算法
*/
#include?
#include?
#include?
#define?Max?8//改變一下這個值就可以
#define?MAXINIT?1000000//這代表一個足夠大的數,也可以成其他更大的數,不要超過32位系統的整型最大數即可
enum?boolean{FALSETRUE};
//首先定義一個圖的鄰接矩陣儲存結構的類型
typedef?struct{
???int?vexs[Max];//頂點數組,
int?arcs[Max][Max];//鄰接矩陣
int?vexnumarcnum;//頂點數,邊數
}AdjMatrix;
//下面是實現求最短路徑的函數
//?s[Max];標記那些已經找到最短路徑的頂點集合,若s[i]=1則表示已經找到源點到v[i]的最短路徑,若s[i]=0則表示尚未找到
//Dist[Max]用于記錄源點到其他頂點的當前的最短距離即路徑長度
//Path[Max]表示源點到v[i]的最短路徑的前驅頂點,若沒有路徑,則Path[i]=-1,
//path[v]表示從v0到v的最短路徑上v的前驅頂點
void?Dijkstra(AdjMatrix?gint?v0int?path[]int?dist[])//vo是源點
{?
/*求有向圖g的從源點到其他頂點的最短路徑*/
int?s[Max]viw1jmin;
for(v=0;v {s[v]=0;
dist[v]=g.arcs[v0][v];
if(dist[v] ??path[v]=v0;
else
path[v]=-1;
}
dist[v0]=0;s[v0]=1;//最開始時,s中只有v0這一個頂點
/*循環求v0到某個頂點v的最短路徑,并將v加入s集*/
for(i=0;i {min=MAXINIT;
?v=-1;//記錄找到的最小距離的定點序號
?for(w1=0;w1 ?if(!s[w1]&&dist[w1] ?{v=w1;
??min=dist[w1];
??
?}
?if(v!=-1)
?{
?s[v]=1;//將頂點v并入s中
?for?(j=0;j
- 上一篇:山東大學歷年C語言題庫.
- 下一篇:八皇后問題課程設計C++版
評論
共有 條評論