貪心演算法之單源最短路徑

2021-06-29 16:36:09 字數 1069 閱讀 5838

問題:在乙個有向網路中,從某點出發得到所有到該頂點的最短距離。

迪傑斯特拉演算法是解單源最短路徑問題的乙個貪心演算法,其基本思想是,設定頂點集合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的前驅頂點,這個頂點...