Skip to content

Commit dda904f

Browse files
authored
Create distance-to-a-cycle-in-undirected-graph.cpp
1 parent 3d1fced commit dda904f

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Time: O(|V| + |E|)
2+
// Space: O(|V| + |E|)
3+
4+
// graph, dfs, bfs
5+
class Solution {
6+
public:
7+
vector<int> distanceToCycle(int n, vector<vector<int>>& edges) {
8+
vector<vector<int>> adj(n);
9+
for (const auto& e : edges) {
10+
adj[e[0]].emplace_back(e[1]);
11+
adj[e[1]].emplace_back(e[0]);
12+
}
13+
return bfs(adj, iter_dfs(adj));
14+
}
15+
16+
private:
17+
vector<int> cycle(const vector<int>& parent, int v, int u) {
18+
vector<int> result = {parent[v], v};
19+
for (; u != parent[v]; u = parent[u]) {
20+
result.emplace_back(u);
21+
}
22+
return result;
23+
}
24+
25+
vector<int> iter_dfs(const vector<vector<int>>& adj) {
26+
vector<int> stk = {0};
27+
vector<int> parent(size(adj), -2);
28+
parent[0] = -1;
29+
while (!empty(stk)) {
30+
const int u = stk.back(); stk.pop_back();
31+
for (const auto& v : adj[u]) {
32+
if (parent[v] != -2) {
33+
if (v == parent[u]) {
34+
continue;
35+
}
36+
return cycle(parent, v, u);
37+
}
38+
parent[v] = u;
39+
stk.emplace_back(v);
40+
}
41+
}
42+
return {};
43+
}
44+
45+
vector<int> bfs(const vector<vector<int>>& adj, vector<int> q) {
46+
vector<int> result(size(adj), -1);
47+
for (const auto& x : q) {
48+
result[x] = 0;
49+
}
50+
for (int d = 1; !empty(q); ++d) {
51+
vector<int> new_q;
52+
for (const auto& u : q) {
53+
for (const auto& v : adj[u]) {
54+
if (result[v] != -1) {
55+
continue;
56+
}
57+
result[v] = d;
58+
new_q.emplace_back(v);
59+
}
60+
}
61+
q = move(new_q);
62+
}
63+
return result;
64+
}
65+
};

0 commit comments

Comments
 (0)