--- tags: 圖論 title: Dijkstra --- # Dijkstra [ZJ c125](https://zerojudge.tw/ShowProblem?problemid=c125) [Atcoder Beginner contest 192 E](https://atcoder.jp/contests/abc192/tasks/abc192_e) ```cpp= priority_queue<T> pq1; priority_queue<T, vector<T>, greater<T> > pq2; T a; pq1.push(a);//把a放進queue裡 O(logN) T b = pq1.top();//b是queue裡面最大值 O(1) T c = pq2.top();//c是queue裡面最小值 O(1) pq1.pop();//把queue中最大的清掉 O(logN) pq1.empty(); pq1.clear(); ``` ```cpp= pair<int, int> P1, P2; P1 = make_pair(1,2), P2 = make_pair(2,1); P1.first;//1 P1.second;//2 struct status{ int num;//點編號 int weight;//從一至num的最短路徑 bool operator<(const status &rhs)const{ return weight < rhs.weight; } }; priority_queue < pair <int,int>, vector <pair <int,int> >, greater <pair <int,int> > > pq; vector<int> edge[N]; vector<int> weight[N]; int dist[N] = {0}; pq.push(make_pair(0, 1)); while(!pq.empty()){ pair<int,int> cur = pq.top();//將最小的狀態拿出來 pq.pop(); int len = cur.first; int num = cur.second; if(dist[num] != 0){ continue; } dist[num] = len; for(int i = 0; i < edge[num].size(); ++i){ if(dist[edge[num][i] != 0]){ continue; } pair<int,int> nxt = make_pair(len+weight[num][i], edge[num][i]); pq.push(nxt); } } ``` dist 1 2 3 4 5 6 val 0 8 4 16 11 10 queue = {(17, 4)} cur = (16, 4) 設共有V個點E個邊 Time Complexity: $O((V+E)log{V})$