무방향 그래프는 두 정점 사이에 두 개의 정점 분리 경로가 있는 경우 이중 연결 그래프라고 합니다. 즉, 두 정점 사이에 순환이 있다고 말할 수 있습니다.
그래프 G가 연결되어 있고 그래프에 관절점이 없거나 절단 정점이 있는 경우 그래프 G는 양방향 그래프라고 말할 수 있습니다.
이 문제를 해결하기 위해 우리는 DFS 순회를 사용할 것입니다. DFS를 사용하여 관절 지점이 있는지 여부를 찾으려고 합니다. 또한 DFS가 모든 정점을 방문하는지 여부를 확인합니다. 그렇지 않으면 그래프가 연결되지 않았다고 말할 수 있습니다.
입력 및 출력
입력:그래프의 인접 행렬.0 1 1 1 01 0 1 0 01 1 0 0 11 0 0 0 10 0 1 1 0출력:그래프는 이중 연결 그래프입니다.
알고리즘
is조음 (시작, 방문, 디스크, 낮음, 상위)
입력: 시작 정점, 노드 방문 시 표시할 방문 배열, 디스크는 정점의 발견 시간을 보유하고, low는 하위 트리에 대한 정보를 보유합니다. 부모는 현재 정점의 부모를 유지합니다.
출력 - 관절점이 발견되면 참입니다.
시작 시간 :=0 //시간 값은 다음 함수 호출을 위해 초기화되지 않습니다. dfsChild :=0 방문으로 시작 표시 set disk[start] :=time+1 and low[start] :=time + 1 time :=그래프 G의 모든 정점 v에 대해 시간 + 1, (start, v) 사이에 간선이 있으면 수행하고, v를 방문하면 증가합니다. dfsChild parent[v] :=start if isArticulation(v,visited , disk, low, parent)가 true이면 ture low[start] :=parent[start]가 φ AND dfsChild> 1인 경우 low[start] 및 low[v]의 최소값을 반환하고 parent[start]인 경우 true를 반환합니다. is φ AND low[v]>=disk[start]이고, v가 start의 부모가 아니면 true를 반환하고, low[start] :=low[start]와 disk[v]의 최소값을 반환합니다. done은 falseEnd를 반환합니다. 사전>isBiconnected(그래프)
입력: 주어진 그래프.
출력 - 그래프가 이중 연결되어 있으면 참입니다.
초기 설정을 시작하면 모든 정점이 방문하지 않고 각 정점의 상위가 φ isArticulation(0, 방문, 디스크, 로우, 상위) =true인 경우 그래프의 각 노드 i에 대해 false를 반환하고 i가 방문하지 않은 경우 수행 , false를 반환하고 true를 반환합니다.예시
#include#define NODE 5 네임스페이스 std;int graph[NODE][NODE] ={ {0, 1, 1, 1, 0}, {1, 0, 1, 0, 0}, { 1, 1, 0, 0, 0}, {1, 0, 0, 0, 1}, {0, 0, 0, 1, 0}}; int min(int a, int b) { return (a 1) { //u가 2개 이상의 자식을 가질 때 true를 반환합니다. } if(부모[시작] !=-1 &&낮음[v]>=디스크[시작]) return true; } else if(v !=parent[start]) //이전 호출에 대한 시작 하위 업데이트 low[start] =min(low[start], disk[v]); } } return false;}bool isBiConnected() { bool *vis =new bool[NODE]; int *디스크 =새로운 int[노드]; int *낮음 =새로운 int[노드]; int *부모 =새로운 int[노드]; for(int i =0; i 출력
그래프는 양방향 그래프입니다.