File tree Expand file tree Collapse file tree 1 file changed +65
-0
lines changed Expand file tree Collapse file tree 1 file changed +65
-0
lines changed Original file line number Diff line number Diff line change
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
+ };
You can’t perform that action at this time.
0 commit comments