Главная Новости Галерея Вопросы Библиотека Контакты

dfs bfs 예제

O(V+E) DFS 또는 BFS(유사하게 작동)를 사용하여 제공된 그래프가 인접한 정점 간에 번갈아 색상(이 시각화에서 주황색대 파란색)을 제공하여 Bipartite 그래프인지 확인하고 동일한 색상을 두 개의 정점에 할당하는 경우 `비쌍분`을 보고할 수 있습니다. 이러한 `2-착색` 프로세스를 수행할 수 있는 경우 인접한 정점 또는 `이분`. 예제 Bipartite 그래프에서 DFS_Checker 또는 BFS_Checker를 사용해 보십시오. 감독 그래프의 SCC를 찾기 위한 알려진 알고리즘은 코사라주와 타얀의 두 가지 알고리즘입니다. 둘 다 이 시각화에서 사용할 수 있습니다. 위의 예에서 코사라주의 알고리즘 및/또는 타잔의 알고리즘을 사용해 보십시오. U.s에서 도달할 수 있는 모든 정점을 지정할 수 있습니다 (위에 표시된 예제 그래프) 단순히 O (V +E) DFS (들) (또는 BFSs))를 호출 하 여 상태[v] = 방문 한 모든 정점 v를 열거. 이 속성이 유용한 이유의 예로, 다음 사실을 증명해 봅시다: 그래프 G에서 G는 적어도 k. 또는 G에는 O(kn) 가장자리가 있습니다. 이 예제에서는 DFS와 BFS 간의 또 다른 차이점을 보여 줍니다. DFS에서는 하나의 경로를 따라 검색한 다음 막다른 길에 도달하면 «역추적»합니다. BFS를 사용하면 경로를 따라 탐색하는 것이 아니라 가능한 여러 경로를 한 번에 탐색하고 있습니다.

막다른 길에 도달하면, 우리는 그 방향으로 검색을 멈추고 국경에 있는 다른 어떤 것에도 집중합니다. `단순`으로 취급할 수 있는 또 다른 DFS(및 BFS) 응용 프로그램: 지시된 비순환 그래프(DAG)의 토폴로지 정렬(ing) 수행 — 위의 예제를 참조하십시오. BFS 버전은 들어오는 가장자리가없는 정점의 아이디어를 기반으로하고 또한 칸의 알고리즘이라고합니다. DAG 예제에서 토포소드(BFS/Kahn`s)를 사용해 보십시오. 이 e-강의의 기본 예제 그래프에서 DFS(0)를 실행합니다(CP3 그림 4.1). DFS 예제 n`; $(`#twosat 보드`).html(toWrite); $(`#twosat 보드`).쇼(«느린»); } 이.examples = 함수(id) { iVL = getExampleGraph(id, VL); iEL = getExampleGraph(ID, EL); 양버트 @ 0; 양세부 = 0; (iEl의 var 키) 양버텍스++; DIRECTED_GR = true; OLD_POSITION = 양가장자리; var newState = createState(iVL, iEL); gw.updateGraph(뉴스테이트, 500); true를 반환합니다. } 이.loadGraph = 기능 (정점 목록, edgeList) { iVL = 정점 목록; iEL = edgeList; fixJSON(); var newState = createState (iVL, iEL); gw.updateGraph (newState, 500); } 함수 createState (iVLObject, iELObject, vertex강조 표시, 강조 표시 됨, 강조 표시 됨 vertexTraversed, 정점 트래버스, 트리에지, 백에지, 크로스에지, 포워드 엣지, hiddenEdge) { 경우 (정점 강조 = = null) 꼭점 강조 = {}; 경우 (가장자리 강조 = = null) 가장자리 강조 = {}; (정점 트래버스 = = null) vertexTraversed = {} 정점 트래버스팅 == null) 정점 트래버스팅 = {}; 경우 (treeEdge == null) 트리엣지 = {}; if (backEdge == null) backEdge = {}; 경우 (크로스 에지 = = null) 크로스 에지 = {}; 경우 (forwardEdge == null) 포워드에지 = {}; (hiddenEdge == null) hiddenEdge = {}; var 키, 상태 = { {«vl»: {}, «el»: {} }; (iVLObject의 키) { 상태[«vl»][키]={}; 상태[«vl»][키][키]]= iVLObject[key][«x»]; 상태[«vl»][키][키]=iVLObject[키], 상태[«vl»][키][키][ 키][«vl»][키][«엑스트라 텍스트»] = iVLObject[key][«extratext»] = 경우[iVLObject]]; 【키】 [«상태»] == OBJ_HIDDEN) 상태[«vl»][키][«상태»] = OBJ_HIDDEN; else state[«vl»][키][«상태»] = VERTEX_DEFAULT; } (iELObject의 키) { 상태[«el»][키] = {}; 상태[«el»][키][«꼭짓점»] = iELObject[키], 상태[«el»][키][키][키][«정점]»]; 경우 (DIRECTED_GR == 거짓) 상태[«el»]]=[키][«[«유형]]]]]]]]]].» ] = 에지_TYPE_DE; 상태[«el»][키][[«무게»] = iELObject[key][«w»]; 경우 (iELObject[키][«상태»] == OBJ_HIDDEN] 상태[«el»]][키][«상태»] = OBJ_HIDDEN; else state[«el»][키][«상태»] = EDGE_DEFAULT; 상태[«el»][키][«디스플레이웨이트»] = 거짓; 상태[«el»][키][«애니메이션 강조 표시»] = 거짓; } (vertexTraversed의 키) 상태[«vl»][키][«상태»] = VERTEX_TRAVERSED; (정점 트래버스의 키) 상태[«vl»][키][«상태»] = VERTEX_BLUE_OUTLINE; (treeEdge의 키) 상태[«el»][키][«상태»] = EDGE_RED; (backEdge의 키) 상태[«el»][키][«상태»] = EDGE_BLUE; (크로스에지의 키) 상태[«el»][키][«상태»] = EDGE_GREEN; (forwardEdge의 키) 상태[«el»][키][«상태»] = EDGE_GREY; 에 대 한 (정점 의 키 강조 표시) 상태[«vl»][키][«상태»] = VERTEX_HIGHLIGHTED; 에 대한 (가장자리의 키강조) { 상태 [«el»]][키][«상태»] = EDGE_HIGHLIGHTED; (iEL의 var keyR) (iEL[key][u]] == iEL[keyR][v]]) 및 & (iEL[key]]]]//=/=iEL[key]]]===iEL[key]]]== iEL[keyR][keyR][u]])) edge[keyinEdge에서 키]에 대한 } «] = EDGE_GREY; 반환 상태; } 기능 채우기 Pseudocode (행위) { 스위치 (행위) { 경우 0: // DFS $(`#code1`).html (`dfS(u)`; $(`#code2`).html (`당신의 각 이웃 v에 대 한`); $(`#code3`).html(`