n개의 서버가 있다고 가정합니다. 그리고 이들은 0에서 n-1까지 번호가 매겨져 있으며, 연결[i] =[a,b]는 서버 a와 b 간의 연결을 나타내는 네트워크를 형성하는 무방향 서버 간 연결로 연결됩니다. 모든 서버는 직접 연결되거나 다른 서버를 통해 연결됩니다. 이제 중요한 연결은 연결이 제거되면 일부 서버가 다른 서버에 연결할 수 없게 만드는 연결입니다. 우리는 모든 중요한 연결을 찾아야 합니다.
따라서 입력이 n =4이고 연결 =[[0,1],[1,2],[2,0],[1,3]],
인 경우
그러면 출력은 [[1,3]]
가 됩니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
한 세트 정의
-
어레이 디스크 정의
-
낮은 어레이 정의
-
하나의 2D 배열 ret 정의
-
dfs() 함수를 정의하면 노드, par, 하나의 2D 배열 그래프가 필요합니다.
-
노드가 방문 중이면 -
-
반환
-
-
방문한 노드에 삽입
-
디스크[노드] :=시간
-
낮은[노드] :=시간
-
(시간을 1 증가)
-
그래프[노드]의 모든 요소 x에 대해
-
x가 par와 같으면 -
-
다음 부분은 무시하고 다음 반복으로 건너뜁니다.
-
-
x가 방문되지 않은 경우 -
-
dfs(x, 노드, 그래프)
-
low[node] :=low[node]와 low[x]의 최소값
-
디스크[노드] <낮음[x]이면 -
-
ret
끝에 { node, x } 삽입
-
-
-
그렇지 않으면
-
low[node] :=low[node] 및 디스크[x]의 최소값
-
-
-
기본 방법에서 다음을 수행하십시오 -
-
디스크의 크기를 n + 1로 설정
-
낮은 크기를 n + 1로 설정
-
시간 :=0
-
크기 그래프 n + 1의 목록 배열 정의
-
initialize i :=0의 경우 i
-
유 :=v[i, 0]
-
승 :=v[i, 1]
-
그래프 끝에 w 삽입[u]
-
그래프 끝에 u를 삽입[w]
-
-
dfs(0, -1, 그래프)
-
리턴 렛
-
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<auto> > v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << "["; for(int j = 0; j <v[i].size(); j++){ cout << v[i][j] << ", "; } cout << "],"; } cout << "]"<<endl; } class Solution { public: set<int> visited; vector<int> disc; vector<int> low; int time; vector<vector<int> > ret; void dfs(int node, int par, vector<int> graph[]) { if (visited.count(node)) return; visited.insert(node); disc[node] = low[node] = time; time++; for (int x : graph[node]) { if (x == par) continue; if (!visited.count(x)) { dfs(x, node, graph); low[node] = min(low[node], low[x]); if (disc[node] < low[x]) { ret.push_back({ node, x }); } } else{ low[node] = min(low[node], disc[x]); } } } vector<vector<int> > criticalConnections(int n, vector<vector<int> >& v) { disc.resize(n + 1); low.resize(n + 1); time = 0; vector<int> graph[n + 1]; for (int i = 0; i < v.size(); i++) { int u = v[i][0]; int w = v[i][1]; graph[u].push_back(w); graph[w].push_back(u); } dfs(0, -1, graph); return ret; } }; main(){ Solution ob; vector<vector<int>> v = {{0,1},{1,2},{2,0},{1,3}}; print_vector(ob.criticalConnections(4,v)); }
입력
4, {{0,1},{1,2},{2,0},{1,3}}
출력
[[1, 3, ],]