問題:在乙個有向網路中,從某點出發得到所有到該頂點的最短距離。
迪傑斯特拉演算法是解單源最短路徑問題的乙個貪心演算法,其基本思想是,設定頂點集合s不斷的貪心選擇來擴充這個集合。當源點到該頂點的最短距離已知,則新增到集合來,最終包括網路中的所有頂點。
貪心選擇:
step1:首先選擇網路中的某一頂點v出發,那麼該頂點肯定可以新增到s中,然後以v為源點,得到它到其他頂點的距離(初始化d,表示v到其他頂點的距離)
step2:在這些頂點中選擇沒有標記過的(即未新增到s集合中的點) 並且到v的距離最小的頂點v』,然後將其標記
step3:更新d,從v'出發遍歷網路沒有標記的頂點,如果找到乙個點d[u]+edge[u][j]
step4:重複step2
效能分析:
演算法時間主要花在兩個for迴圈中,時間複雜度為o(n2)
**實現:
#includetypedef char vertextype;
typedef int edgetype;
#define max 20//定義陣列大小
#define infinity 500
typedef struct
adjmatrix;
//建立圖的鄰接矩陣
adjmatrix creatgraph_matrix(int graphtype)
setbuf(stdin,null);
for(i=1;i<=g.vexnum;i++)
for(j=1;j<=g.vexnum;j++)
g.edges[i][j]=infinity;
for(k=1;k<=g.arcnum;k++)
return g;
}void dijkstra(adjmatrix &n,int v,int d,int p)
s[v]=1;
/**********開始最短路徑求解************/
for(i=1;i<=n.vexnum;i++)
}} }}
int main()
return 0;
}
單源最短路徑 貪心演算法
乙個點 源點 到其餘各個頂點的最短路徑。也叫做 單源最短路徑 dijkstra。dijkstra的主要思想 每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑 用flag標示該點是否在離源點最近的集合中 演算法步驟 1.初始時,s只包含源點,即p v的距...
貪心演算法 單源最短路徑 dijkstra
關於單源最短路徑的問題非常典型,這裡沒有給出分析與證明,僅僅給出了實現。需要指出的是,許多實現僅給出了最短路徑的長度,而沒有給出 最短路徑 這裡用給出了實現。如程式中那樣,定義乙個陣列p n 其中p i 代表 起始點v到頂點i的最短路徑中,除i本身的最後乙個頂點 即著這條路徑上i的前驅頂點,這個頂點...
貪心演算法 單源最短路徑 dijkstra
關於單源最短路徑的問題非常典型,這裡沒有給出分析與證明,僅僅給出了實現。需要指出的是,許多實現僅給出了最短路徑的長度,而沒有給出 最短路徑 這裡用給出了實現。如程式中那樣,定義乙個陣列p n 其中p i 代表 起始點v到頂點i的最短路徑中,除i本身的最後乙個頂點 即著這條路徑上i的前驅頂點,這個頂點...