上一篇:
[← STL筆記](https://hackmd.io/Az-1YypcS3iFLrHWwZg-bw)
:::warning
要有一定STL基礎
:::
DFS
---
+ 深度優先搜尋 Deep First Search
+ 盡可能往較深的節點走
+ 可以用來計算樹的**深度**或**最長路徑**
+ 實作程式碼:
BFS
---
+ 廣度優先搜尋 Breadth First Search
+ 盡可能往較淺的節點走
+ 適合計算**最短路徑**
實作程式碼:[zj a290.新手訓練系列 ~ 圖論](https://zerojudge.tw/ShowProblem?problemid=a290)
```cpp=
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
int n, m, a, b, A, B;
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//cin & cout 優化 不加不能AC哦QAQ
//這個建議背起來
while (cin >> n >> m)
{
vector<int> edge[801];
for (int i = 0; i < m; i++)
{
cin >> a >> b;
edge[a].push_back(b); //把a連接到b
}
cin >> A >> B;
queue<int> q; //先進先出FIFO
q.push(A); //A是起點
bool ans = false; //設ans判斷是否能走到
while (!q.empty())
{
int i = q.front();
q.pop(); //移除已走訪的節點
if (i == B)
{
ans = true;
break;
}
for (int j: edge[i])
q.push(j); //將所有i連接到的點塞進queue
}
if (ans) cout << "Yes!!!\n";
else cout << "No!!!\n";
}
return 0;
}
```
Dijkstra
---
+ 具有權重的BFS
+ 計算最短路
程式碼:
```cpp=
struct node
{
int to, w;
};
vector<node> edge[N];
vector<int> d(N, 0x3f3f3f3f);
priority_queue<pair<int, int>> pq;
pq.push({0, 起始點編號});
d[起始點編號] = 0;
//只要pq不是空的就繼續走訪
while (!q.empty())
{
//取出(負路徑長w, 編號點u),並檢查-w是否與當前總長相同
tie(w, u) = pq.top(); pq.pop();
if (-w != d[u]) continue;
//對d[新的點] > d[目前點] + w 的情況更新總長
for (auto i: edge[[u]])
if (d[i.to] > d[u] + w)
{
d[i.to] = d[u] + i.w;
pq.push({-d[i.to], i.to});
}
}
```
___
上一篇:
[← STL筆記](https://hackmd.io/Az-1YypcS3iFLrHWwZg-bw)