그래프의 기본 연산 깊이-우선 탐색(DFS; Depth-First Search) (1) 출발 정점 v를 방문

Slides:



Advertisements
Similar presentations
14 장. 그래프 알고리즘 Internet Computing KUT Youn-Hee Han.
Advertisements

그래프(Graph)
주요 내용 기본 용어 이진 트리(binary tree) 이진 탐색 트리(binary search tree)
주요 내용 기본 용어 그래프의 표현 오일러(Euler) 그래프와 해밀턴(Hamilton) 그래프
Maximum Flow.
제 6 장 그래프 6.1 그래프의 정의 6.2 용어 및 표현법 6.3 그래프의 표현 방법 6.4 그래프의 순회와 신장 트리
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
유한 오토마타 Finite Automata
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
Ch.04 Greedy Method (탐욕적 방법)
Internet Computing KUT Youn-Hee Han
CHAP 10:그래프 (1) 순천향대학교 하상호.
CHAP 10:그래프 순천향대학교 하상호.
그래프 추상 데이타 타입(1/9) 개요 Koenigsberg 다리 문제 차수(degree) : 정점에 연결된 간선의 수
CHAP 10 : 그래프 C로 쉽게 풀어쓴 자료구조 생능출판사 학기 데이터구조.
CHAP 10:그래프 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 10 : 그래프 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 62).
자료구조론 10장 그래프(graph).
제 6 장 그래프.
되추적(Backtracking).
자료구조: CHAP 6 큐 컴퓨터공학과 하 상 호.
9장 가중치 그래프.
P150 문제를 프로그래밍 할 것 Source file (헤더파일포함), 실행화면 (학번_이름_1.txt)
C언어 응용 제 13 주 그래프2, 정렬.
Chapter 10 그래프(graph) SANGJI University Kwangman KO
강의 #9 그래프(Graph).
Ch.04 Greedy Method (탐욕적 방법)
CHAP 10 : 그래프.
CHAP 10 : 그래프.
CHAP 10: 그래프(part 2) 순천향대학교 하상호.
보고서 #5(제출기한: 10/14) 다음 문제를 해결하시오.
C언어 응용 제 11 주 그래프1.
자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
그래프(graph) 연결되어 있는 객체 간의 관계를 표현하는 자료구조 가장 일반적인 자료구조 형태
부분집합의 합 구하기 문제 부분집합의 합 구하기(Sum-of-Subsets) 문제
탐욕적인 방법(Greedy Approach)
탐욕적인 방법(Greedy Approach)
Introduction To Data Structures Using C
3. while문 반복문의 종류 while 문 while( 조건식 )        문장;.
CHAPTER 6 그래프.
CHAP 10:그래프 (2) 순천향대학교 하상호.
어서와 C언어는 처음이지 제14장.
컴퓨터 개론 및 실습 Dept. Computer Eng. Hankuk University of Foreign Studies
Chapter03 캔버스(1) HTML5 Programming.
군집 분석.
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
주요 내용 왜 그래프인가? 기본 용어 그래프의 표현 오일러(Euler) 그래프와 해밀턴(Hamilton) 그래프
쉽게 배우는 알고리즘 12장. 상태공간 트리의 탐색.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
트리.
객체기반 SW설계 팀활동지 4.
알고리즘 알고리즘이란 무엇인가?.
Chapter 7. 그래프.
CHAP 10 : 그래프.
보고서 #2(제출기한: 09/23) 다음 문제를 해결하시오. (7)
MST – Kruskal 알고리즘 (추상적)
부분집합의 합 구하기 문제 부분집합의 합 구하기(Sum-of-Subsets) 문제
트리 (Logical) Data Structures Linear list Tree Graph Linear structures
쉽게 배우는 알고리즘 12장. 상태공간 트리의 탐색
제 9 장 그래프.
문제풀이방식-맹목적 탐색 Ai4.
교착 상태 해결 : 교착 상태 탐지 교착 상태 탐지(Deadlock Detection)
보고서 #4 (1) (제출기한: 10/6) #1 다음 그래프 G에 대해서 답하시오. (2*5 = 10)
C++ Espresso 제15장 STL 알고리즘.
배열, 포인터, 함수 Review & 과제 1, 2.
Presentation transcript:

그래프의 기본 연산 깊이-우선 탐색(DFS; Depth-First Search) (1) 출발 정점 v를 방문 (2) v에 인접하고 방문하지 않은 한 정점 w를 선택 (3) w를 시작점으로 다시 깊이 우선 탐색 시작 (4) 모든 인접 정점을 방문한 정점 u에 도달하면, 최근에 방문한 정점 중 아직 방문을 안한 정점 w와 인접하고 있는 정점으로 되돌아감 (5) 정점 w로부터 다시 깊이 우선 탐색 시작 (6) 방문을 한 정점들로부터 방문하지 않은 정점으로 더 이상 갈 수 없을 때 종료

깊이 우선 탐색(1/3) #define FALSE 0 #define TRUE 1 short int visited[MAX_VERTICES]; void dfs (int v) {/* 그래프의 정점 v에서 시작하는 깊이 우선 탐색 */ nodePointer w; visited[v] = TRUE; printf(“%5d”, v); for (w = graph[v]; w; w = w → link) if (!visited [w→vertex]) dfs (w→vertex); } 깊이-우선 탐색

깊이 우선 탐색(2/3) 예제 6.1 0, 1, 3, 7, 4, 5, 2, 6 순으로 방문 [0] [1] [2] [3] [4] 1 2 3 4 5 6 7 adjLists ( a) [0] [1] [2] [3] [4] [5] [6] [7] 1 2 3 4 5 6 1 7 1 7 2 7 2 7 3 4 5 6 (b) 그래프 G와 그 인접리스트

깊이 우선 탐색(3/3) DFS의 분석 탐색을 끝내는 시간 O (e) v에 인접한 모든 정점들을 찾는데 O (n)의 시간

너비 우선 탐색(1/2) 너비 우선 탐색(BFS; Breadth-First Search) 예제 6.2 시작 정점 v를 방문 새롭게 방문한 정점들에 인접하면서 아직 방문하지 못한 정점들을 방문 예제 6.2 0, 1, 2, 3, 4, 5, 6, 7 순으로 방문 1 2 3 4 5 6 7

너비 우선 탐색(2/2) BFS의 분석 전체 시간 O(n2) 인접 리스트 표현 : 전체 비용 O(e) void bfs(int v) {/* 정점 v에서 시작하는 너비 우선 탐색. 전역배열 visited는 0으로 초기화됨} node_pointer w; queue_pointer front, rear; front = rear = NULL; /* 큐의 초기화 */ printf(“%5d”, v); visited[v] = TRUE; addq(&front, &rear, v); while (front){ v = deleteq(&front); for (w=graph[v]; w; w=w→link) if (!visited[w→vertex]) { printf(“%5d”, w→vertex); addq(&front, &rear, w→vertex); visited[w→vertex] = TRUE; } BFS의 분석 전체 시간 O(n2) 인접 리스트 표현 : 전체 비용 O(e)

신장트리(1/2) 신장트리(spanning tree) : G의 간선들로만 구성되고 G의 모든 정점들이 포함된 트리 깊이-우선 신장트리(depth-first spanning tree) 너비-우선 신장트리(breadth-first spanning tree) 완전 그래프와 이 그래프의 세 신장트리 1 2 1 2 3 4 5 6 3 4 5 6 7 7 (a) DFS(0) 신장 트리 (b) BFS(0) 신장 트리

최소비용 신장트리 최소비용 신장트리(minimum-cost spanning tree) 최저의 비용을 갖는 신장트리 Kruskal, Prim, Sollin 알고리즘 갈망법(greedy method) 최적의 해를 단계별로 구한다 각 단계에서는 몇 개의 판단 기준에 따라 최상의 결정을 내린다 한번 내려진 결정은 뒤에 번복이 불가능하므로 각각의 결정이 가능한 해를 도출해낼 수 있는 지 확인 신장트리의 제한 조건 (1) 그래프내에 있는 간선들만을 사용 (2) 정확하게 n-1개의 간선만을 사용 (3) 사이클을 생성하는 간선을 사용 금지

Kruskal 알고리즘(1/3) 알고리즘 한번에 하나씩 T에 간선을 추가해가면서 최소비용 신장트리 T를 구축 G는 연결되어 있고 n>0개의 정점을 가지므로 정확하게 n-1개의 간선만이 T에 포함됨.

Kruskal 알고리즘(2/3) 예제 6.3 Kruskal 알고리즘의 각 단계 28 10 1 10 10 1 1 1 14 5 5 28 10 1 10 10 1 1 1 14 5 5 16 5 5 6 2 24 6 6 2 2 6 2 25 4 4 18 4 4 12 12 3 22 3 3 3 ( d) ( a) ( b) ( c) 10 10 10 10 1 1 1 1 14 14 14 14 5 16 5 16 5 5 16 6 6 6 6 2 2 2 2 25 4 4 4 4 12 12 12 12 22 3 22 3 3 3 ( g) ( h) ( e) ( f) Kruskal 알고리즘의 각 단계

Kruskal 알고리즘(3/3) T = { }; while ((T가 n-1개 미만의 간선을 포함) && (E가 공백이 아님)) { E에서 최소 비용 간선 (v,w) 선택; E에서 (v,w)를 삭제; if (v,w)가 T에서 사이클을 만들지 않으면 add (v, w) to T; else discard (v,w); } if (T가 n-1개 미만의 간선을 포함) cout << "신장 트리 없음" << endl; Kruskal 알고리즘 정리 6.1 G를 무방향 연결 그래프라 하자. Kruskal 알고리즘은 최소비용 신장트리를 생성한다.

Prim 알고리즘(1/3) 알고리즘 한번에 한 간선씩 최소 비용 신장 트리를 구축 각 단계에서 선택된 간선의 집합은 트리 하나의 정점으로 된 트리 T에서 시작 최소 비용 간선 (u,v)를 구해 T U {(u,v)}이 트리가 되면 T에 추가 T에 n-1개의 간선이 포함될 때까지 간선의 추가 단계를 반복 추가된 간선이 사이클을 형성하지 않도록 각 단계 에서 간선 (u,v)를 선택할 때 u 또는 v중 오직 하나만 T에 속한 것을 고른다.

Prim 알고리즘(2/3) Prim 알고리즘 T = { }; TV ={0}; /* 정점 0으로 시작. 간선은 비어 있음.*/ while(T의 간선수가 n-1보다 적음) { u ∈ TV이고 v ∈ TV인 최소 비용 간선을 (u, v)라 함; if (그런 간선이 없음) break; v를 TV에 추가; (u, v)를 T에 추가; } if (T의 간선수가 n-1보다 적음) printf ("신장트리 없음\n“); Prim 알고리즘

Prim 알고리즘(3/3) Prim 알고리즘의 진행 단계 10 1 10 1 10 1 5 5 5 6 6 6 2 2 2 25 25 10 1 10 1 10 1 5 5 5 6 6 6 2 2 2 25 25 4 4 4 22 3 3 3 (a) (b) (c) 10 1 10 1 10 1 14 16 16 5 5 5 6 6 6 2 2 2 25 25 25 4 4 4 12 12 12 22 22 22 3 3 3 (d) (e) (f) Prim 알고리즘의 진행 단계

Sollin 알고리즘 알고리즘 각 단계에서 여러개의 간선을 선택 각 단계에서는 포리스트에 있는 각 트리에 대해 하나의 간선을 선택 이 간선은 오직 하나의 정점만 그 트리에 속한 최소 비용 간선 선택된 간선은 구축중인 신장트리에 추가 오직 하나의 트리만이 존재 or 더 이상 선택할 간선이 없을 때 종료 10 1 10 1 14 14 16 5 5 6 6 2 2 25 4 4 12 12 22 22 3 3 (a) (b) Sollin 알고리즘의 단계들