計蒜客:騎車比賽(Dijkstra)

Coder何發表於2024-11-08

學習堆最佳化的寫法

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n, m, a, b, c;
 4 typedef pair<int, int> pii; //first表示距離,second表示節點號
 5 vector<pii> graph[1005];
 6 set<pii> minHeap;
 7 vector<int> dis(1005, INT32_MAX);
 8 vector<bool> visited(1005, false); //記錄已完成維護的點集
 9 void dij() {
10     while(!minHeap.empty()) { //維護最小堆以及dis、visited兩個陣列
11         auto iter = minHeap.begin();
12         int node = iter -> second;
13         minHeap.erase(*iter);
14         visited[node] = true;
15         for (auto i : graph[node]) {
16             if (!visited[i.second]) {
17                 if (dis[i.second] > dis[node] + i.first) {
18                     minHeap.erase(make_pair(dis[i.second], i.second));
19                     dis[i.second] = dis[node] + i.first;
20                     minHeap.insert(make_pair(dis[i.second], i.second));
21                 }
22             }
23         }
24     }
25 }
26 int main() {
27     cin >> n >> m;
28     while(m --) {
29         cin >> a >> b >> c;
30         graph[a].push_back(make_pair(c, b));
31         graph[b].push_back(make_pair(c, a));
32     }
33     dis[1] = 0;
34     minHeap.insert(make_pair(0, 1));
35     dij();
36     cout << dis[n] << endl;
37 }

相關文章