Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

feat: python impl for 0-1 BFS#1380

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
clumsy wants to merge1 commit intocp-algorithms:main
base:main
Choose a base branch
Loading
fromclumsy:fix/0_1_bfs
Open
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 71 additions & 38 deletionssrc/graph/01_bfs.md
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,27 +17,44 @@ In this article we demonstrate how we can use BFS to solve the SSSP (single-sour
We can develop the algorithm by closely studying Dijkstra's algorithm and thinking about the consequences that our special graph implies.
The general form of Dijkstra's algorithm is (here a `set` is used for the priority queue):

```cpp
d.assign(n, INF);
d[s] = 0;
set<pair<int, int>> q;
q.insert({0, s});
while (!q.empty()) {
int v = q.begin()->second;
q.erase(q.begin());

for (auto edge : adj[v]) {
int u = edge.first;
int w = edge.second;

if (d[v] + w < d[u]) {
q.erase({d[u], u});
d[u] = d[v] + w;
q.insert({d[u], u});
=== "C++"
```cpp
d.assign(n, INF);
d[s] = 0;
set<pair<int, int>> q;
q.insert({0, s});
while (!q.empty()) {
int v = q.begin()->second;
q.erase(q.begin());

for (auto edge : adj[v]) {
int u = edge.first;
int w = edge.second;

if (d[v] + w < d[u]) {
q.erase({d[u], u});
d[u] = d[v] + w;
q.insert({d[u], u});
}
}
}
Comment on lines +20 to 40
Copy link
Member

@adamant-pwnadamant-pwnOct 24, 2024
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Suggested change
=== "C++"
```cpp
d.assign(n, INF);
d[s] = 0;
set<pair<int, int>> q;
q.insert({0, s});
while (!q.empty()) {
int v = q.begin()->second;
q.erase(q.begin());
for (auto edge : adj[v]) {
int u = edge.first;
int w = edge.second;
if (d[v] + w < d[u]) {
q.erase({d[u], u});
d[u] = d[v] + w;
q.insert({d[u], u});
}
}
}
=== "C++"
```cpp
d.assign(n, INF);
d[s] = 0;
priority_queue<pair<int, int>> q = {{0, s}};
while (!empty(q)) {
int [dv, v] = q.top();
q.pop();
if (-dv == d[v]) {
for (auto [u, w] : adj[v]) {
if (d[v] + w < d[u]) {
d[u] = d[v] + w;
q.insert({-d[u], u});
}
}
}
}

Probably best to make this consistent with Python then. Also remove the comment about "set" above if this is incorporated.

}
```
```
=== "Python"
```py
from heapq import heappop, heappush


d = [float("inf")] * n
d[s] = 0
q = [(0, s)]
while q:
dv, v = heappop(q)
if dv == d[v]:
for u, w in adj[v]:
if d[v] + w < d[u]:
d[u] = d[v] + w
heappush(q, (d[u], u))
```

We can notice that the difference between the distances between the source `s` and two other vertices in the queue differs by at most one.
Especially, we know that $d[v] \le d[u] \le d[v] + 1$ for each $u \in Q$.
Expand All@@ -53,27 +70,43 @@ This structure is so simple, that we don't need an actual priority queue, i.e. u
We can simply use a normal queue, and append new vertices at the beginning if the corresponding edge has weight $0$, i.e. if $d[u] = d[v]$, or at the end if the edge has weight $1$, i.e. if $d[u] = d[v] + 1$.
This way the queue still remains sorted at all time.

```cpp
vector<int> d(n, INF);
d[s] = 0;
deque<int> q;
q.push_front(s);
while (!q.empty()) {
int v = q.front();
q.pop_front();
for (auto edge : adj[v]) {
int u = edge.first;
int w = edge.second;
if (d[v] + w < d[u]) {
d[u] = d[v] + w;
if (w == 1)
q.push_back(u);
else
q.push_front(u);
=== "C++"
```cpp
vector<int> d(n, INF);
d[s] = 0;
deque<int> q;
q.push_front(s);
while (!q.empty()) {
int v = q.front();
q.pop_front();
for (auto edge : adj[v]) {
int u = edge.first;
int w = edge.second;
if (d[v] + w < d[u]) {
d[u] = d[v] + w;
if (w == 1)
q.push_back(u);
else
q.push_front(u);
}
}
}
Comment on lines +75 to 93
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Suggested change
vector<int> d(n, INF);
d[s] = 0;
deque<int> q;
q.push_front(s);
while (!q.empty()) {
int v = q.front();
q.pop_front();
for (auto edge : adj[v]) {
int u = edge.first;
int w = edge.second;
if (d[v] + w < d[u]) {
d[u] = d[v] + w;
if (w == 1)
q.push_back(u);
else
q.push_front(u);
}
}
}
vector<int> d(n, INF);
d[s] = 0;
deque<int> q = {s};
while (!empty(q)) {
int v = q.front();
q.pop_front();
for (auto [u, w] : adj[v]) {
if (d[v] + w < d[u]) {
d[u] = d[v] + w;
if (w == 1)
q.push_back(u);
else
q.push_front(u);
}
}
}

}
```
```
=== "Python"
```py
d = [float("inf")] * n
d[s] = 0
q = deque([s])
while q:
v = q.popleft()
for u, w in adj[v]:
if d[v] + w < d[u]:
d[u] = d[v] + w
if w == 1:
q.append(u)
else:
q.appendleft(u)
```

## Dial's algorithm

Expand Down
Loading

[8]ページ先頭

©2009-2025 Movatter.jp