一般形式的用鄰接矩陣來實現dijkstra效率比較低,我這裡直接記錄的是用鄰接表的方法以及用優先佇列加以應用。
首先解釋什麼是dijkstra演算法
dijkstra演算法
dijkstra演算法適用於求單源最短路,即可以求出起點到其餘各點之間的最短路。它的演算法實現是乙個不斷更新的過程。
舉乙個最簡單的例子,假設有這麼乙個圖
,紅色表示權值,黑色表示4個點以及路徑,我們假設起點為1,用d[i]來表示1到i的最短路,那麼在第一輪的時候,d[2]=1,d[3]=1,d[4]=5,再下一輪的時候會對這個情況進行更新,結果為d[2]=1,d[3]=1,d[4]=4,以此類推,會一直更新到d[2]=1,d[3]=1,d[4]=3為止,所以我認為該演算法是乙個不斷更新的過程。
鄰接表表示法
鄰接表表示法我們使用vector以及pair兩種工具,可以極大的節省空間以及演算法實現中遍歷搜尋的時間,舉乙個例子
該圖的鄰接表表示為
,具體實現可以看**
洛谷p1346
解題思路大概就是把預設指向的軌道的權值設為0,需要開關的軌道權值設為1。
1 #include 2 #include 3 #include洛谷p13394 #include 5 #include 6 #include 7 #include 8 #include 9 #include
10using
namespace
std;
11#define ll long long
12static
const
int white=0;//
未選13
static
const
int gray=1;//
備選14
static
const
int black=2;//
已選15
static
const
int infty=(1
<<20
);16
intn,a,b;
17 vectorint,int> > adj[105];//
加權圖的鄰接表表示法
18void
dijkstra()
1927 d[a]=0;//
設定起點
28 que.push(make_pair(0
,a));
29 color[a]=gray;
30while (!que.empty())
3149}50
}51if(d[b]==infty)
52 cout<
<
53else
545758}
59int
main()
6072
for(int j=2;j<=k;j++)
7377}78
dijkstra();
79return0;
80 }
1 #include 2 #include 3 #include4 #include 5 #include 6 #include 7 #include 8 #include 9 #include
10using
namespace
std;
11#define ll long long
12static
const
int white=0;13
static
const
int gray=1;14
static
const
int black=2;15
static
const
int infty=(1
<<20
);16
intt,c,ts,te;
17 vectorint,int> > adj[2505
];18
void
dijkstra()
1927 d[ts]=0
;28 que.push(make_pair(0
,ts));
29 color[ts]=gray;
30while (!que.empty())
3149}50
}51 cout
53int
main()
5464
dijkstra();
65return0;
66 }
單源最短路徑問題(狄克斯特拉演算法)
挑戰程式設計競賽2上的一道例題 p250 include using namespace std static const int max 100 static const int infty 1 21 這裡表示int型別最大值 static const int white 0 表示三種狀態 sta...
狄克斯特拉演算法
廣度優先演算法,它找出的是段數最少的路徑 無向圖 如果我們要找出最快的路徑 加權圖 可以使用狄克斯特拉演算法。狄克斯特拉演算法包含四個步驟 1.找出 最便宜 的節點,即可在最短時間內到達的節點 2.更新該節點的鄰居的開銷 3.重複這個過程,直到對圖中的每個節點都這樣做了 4.計算最終路徑 以下圖為例...
狄克斯特拉演算法
是由荷蘭計算機科學家狄克斯特拉於1959 年提出的。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向無環圖中最短路徑問題,且不能有負權邊。狄克斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。示例 找出從起點到終點的最短路徑 當前起點到各點的花費,選擇最小且沒有被檢...