CHAP 10:그래프 (1) 2016. 9. 22 순천향대학교 하상호.

Slides:



Advertisements
Similar presentations
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
Advertisements

14 장. 그래프 알고리즘 Internet Computing KUT Youn-Hee Han.
1. 도형의 연결 상태 2. 꼭지점과 변으로 이루어진 도형 Ⅷ. 도형의 관찰 도형의 연결상태 연결상태가 같은 도형 단일폐곡선의 성질 연결상태가 같은 입체도형 뫼비우스의 띠.
그래프(Graph)
주요 내용 기본 용어 그래프의 표현 오일러(Euler) 그래프와 해밀턴(Hamilton) 그래프
제2장 주파수 영역에서의 모델링.
제14장 동적 메모리.
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
연결리스트(linked list).
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
CHAP 10:그래프 순천향대학교 하상호.
그래프 추상 데이타 타입(1/9) 개요 Koenigsberg 다리 문제 차수(degree) : 정점에 연결된 간선의 수
CHAP 10 : 그래프 C로 쉽게 풀어쓴 자료구조 생능출판사 학기 데이터구조.
CHAP 10:그래프 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 10 : 그래프 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 62).
제5장 트리.
자료구조론 10장 그래프(graph).
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
제 5 장. 스택(Stack).
9장 가중치 그래프.
P150 문제를 프로그래밍 할 것 Source file (헤더파일포함), 실행화면 (학번_이름_1.txt)
Chapter 10 그래프(graph) SANGJI University Kwangman KO
강의 #9 그래프(Graph).
그래프의 기본 연산 깊이-우선 탐색(DFS; Depth-First Search) (1) 출발 정점 v를 방문
자료구조: CHAP 4 리스트 (1) 순천향대학교 컴퓨터공학과 하 상 호.
CHAP 10 : 그래프.
CHAP 10 : 그래프.
CHAP 10: 그래프(part 2) 순천향대학교 하상호.
보고서 #5(제출기한: 10/14) 다음 문제를 해결하시오.
C언어 응용 제 11 주 그래프1.
자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
그래프(graph) 연결되어 있는 객체 간의 관계를 표현하는 자료구조 가장 일반적인 자료구조 형태
부분집합의 합 구하기 문제 부분집합의 합 구하기(Sum-of-Subsets) 문제
Introduction To Data Structures Using C
CHAP 10:그래프 (2) 순천향대학교 하상호.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
자바 5.0 프로그래밍.
프로그래밍 개요
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
주요 내용 왜 그래프인가? 기본 용어 그래프의 표현 오일러(Euler) 그래프와 해밀턴(Hamilton) 그래프
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
이산수학 – Discrete Mathematics
알고리즘: 우선순위 큐(8장) 순천향대학교 컴퓨터 학부 하 상 호.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
그래프의 용어 알고리즘 수업자료 김정현.
객체기반 SW설계 팀활동지 4.
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
데이터 동적 할당 Collection class.
알고리즘: 우선순위 큐(8장) 순천향대학교 컴퓨터 학부 하 상 호.
CHAP 10 : 그래프.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
보고서 #2(제출기한: 09/23) 다음 문제를 해결하시오. (7)
원의 방정식 원의 방정식 x축, y축에 접하는 원의 방정식 두 원의 위치 관계 공통접선 원과 직선의 위치 관계
부분집합의 합 구하기 문제 부분집합의 합 구하기(Sum-of-Subsets) 문제
3장 (2) 구문과 의미론 순천향대학교 컴퓨터공학과 하상호.
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 4 장 Record.
이산수학 논리∙명제에서 알고리즘까지 √ 원리를 알면 IT가 맛있다.
제 9 장 그래프.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
교착 상태 해결 : 교착 상태 탐지 교착 상태 탐지(Deadlock Detection)
보고서 #4 (1) (제출기한: 10/6) #1 다음 그래프 G에 대해서 답하시오. (2*5 = 10)
6 객체.
Presentation transcript:

CHAP 10:그래프 (1) 2016. 9. 22 순천향대학교 하상호

목차 그래프 개요 그래프 표현 그래프 탐색 연결 성분 신장 트리 최소비용 신장 트리 최단 경로 위상정렬

그래프 그래프(graph): 연결되어 있는 객체간의 관계를 표현하는 자료구조 그래프의 예: 전기회로, 프로젝트관리, 지도에서 도시들의 연결 그래프: 아주 일반적인 자료구조 (예) 트리도 그래프의 일종으로 볼수 있다. 그래프 이론(graph theory): 그래프를 문제해결의 도구로 이용하는 연구분야로 많은 이론과 응용이 존재

그래프 역사 1800년대 오일러에 의하여 창안 오일러 문제: 모든 다리를 한번만 건너서 처음 출발했던 장소로 돌아오는 경로(이를 오닐러 경로라 함)가 존재하는가? 문제의 핵심만을 표현 위치: 정점(node) 다리: 간선(edge) 오일러 경로: 각 정점에 연결된 간선의 개수가 짝수이면 존재

그래프 용어(1) 그래프는 2개의 집합, (V, E)의 정의 예제 그래프 V는 정점(vertices)들의 집합 E는 간선(edge)들의 집합 V(G), E(G)는 G의 정점들의 집합, 간선들의 집합 표현 G = (V, E)는 한 개의 그래프 표현 예제 그래프 정점은 각 도시를 의미한다. 간선은 도시를 연결하는 도로를 의미한다. 간선에는 도로의 길이등의 데이터가 저장될 수 있다.

그래프 표현의 예 V(G1)= ?     E(G1)= ? V(G2)= ? E(G3)= ? V(G2)= ?         E(G2)= ?

그래프의 종류 간선의 종류에 따른 구분: 정점쌍에 순서 존재 여부 무방향 그래프(undirected graph) 무방향 간선: 간선을 통해서 양방향으로 갈수 있음을 나타내며 (A, B)와 같이 정점의 쌍으로 표현 (A, B) = (B, A) 방향 그래프(directed graph)로 구분 방향간선: 방향성이 존재하는 간선으로 도로의 일방통행길과 마찬가지로 한쪽 방향으로만 갈 수 있음을 나타낸다. <A, B>로 표시한다. <A, B>에서, A는 꼬리(tail), B는 머리(head)라 함. <A, B> ≠ <B, A> 가중치 그래프(weighted graph), 네트워크(network): 간선에 비용이나 가중치가 할당된 그래프 A B A B 1200 A B

그래프 표현 예: more Q: 트리는 그래프인가? Q: (v1, v2) 또는 <v1, v2>가 E(G)에 속하면, v1 ≠ v2? Q: G는 동일한 간선을 여러 개 포함할 수 있는가? Q: G가 무방향 그래프이고, |V(G)| = n일 때, 최대 간선의 개수는? - 이러한 그래프를 완전 그래프(complete graph)라 한다 - G가 방향그래프이면, 최대 간선의 개수는?

그래프 용어(2) 인접 (adjacent)과 부속(incident) (v1, v2) ∈ E(G)이면, v1, v2는 인접되어 있다고 한다. (v1, v2)는 v1, v2에 부속되어 있다고 한다. 예제: G1에서 정점 0에 인접된 정점들은? G1에서 정점 3에 부속된 간선은?

그래프 용어(3) 부분 그래프(subgraph) G=(V, E), G’ = (V’, E’)에서, 다음을 만족하면 G’은 G의 부분 그래프이다. V(G’) ⊆ V(G), E(G’) ⊆ E(G) 예제: 다음 G1에서 부분 그래프를 식별하시오.

복습 다음 그래프 G에 대해서 답하시오. 4 1 5 V(G) = ? E(G)= ? 정점 1에 인접된 정점들은? 정점 1에 부속된 간선은? G의 부분 그래프는? G는 완전 그래프인가? 4 1 5

그래프 용어(4) 경로(path)는 정점의 나열로 표현 G에서 정점 vp부터 vq까지의 경로는 다음 정점들의 시퀀스이다. vp, vi1, vi2, … vin, vq where (vp, vi1), (vi1, vi2), …. (vin, vq) ∈ V(G) 예제: G1에서, 정점 0부터 정점 3까지의 경로는? G가 방향 그래프이면, 방향 경로(directed path)로 정의 <vp, vi1>, <vi1, vi2>, ….<vin, vq>

그래프 용어(4-2) 경로의 길이(path length) 단순경로(simple path) 사이클(cycle) 경로를 구성하는데 사용된 간선들의 개수 단순경로(simple path) 처음과 끝의 정점을 제외하고는 모든 정점들이 서로 다른 경로 예: 0, 1, 2, 3 사이클(cycle) 처음과 끝의 정점이 동일한 단순 경로 방향 그래프에서는 방향 사이클(directed cycle)이라 함 예: 0, 1, 2, 0

복습 다음 그래프 G에 대해서 답하시오. 4부터 1까지의 경로는? 경로 4, 0, 5, 1과 4, 0, 5, 0을 고려 위 경로의 길이는? 어느 것이 단순 경로인가? 사이클을 식별하라. 4 1 5

그래프 용어(5) 연결 그래프(connected graph) 4 1 4 1 2 3 5 5 G2 G1 무방향 그래프 G에서, 두 정점 v1, v2간에 경로가 존재하면, v1, v2는 연결되어 있다고 한다. V(G)의 임의 두 정점 vi, vj에 대해서, vi로부터 vj간에 경로가 존재하면, G는 연결되어 있다고 한다. 예제: 다음 그래프 G1, G2는 연결되어 있는가? 4 1 4 1 2 3 5 5 G2 G1

그래프 용어(6) 연결 컴포넌트(connected component, 연결 성분) 4 1 4 1 2 3 5 5 G2 G1 최대로 연결된 부분 그래프(maximal connected subgraph) 연결된 부분 그래프들중에서 크기가 최대인 것 예제: 다음 그래프에서 연결 성분을 찾아라. 4 1 4 1 2 3 5 5 G2 G1

문제 다음 그래프 G에 대해서 답하시오. G4는 연결되어 있는가? G의 연결 성분은? 1 5 3 2 6 7 4 8

그래프 용어 (7) 강연결 그래프(strongly connected graph) 방향 그래프 G에서, V(G)의 임의 두 정점 vi, vj에 대해서, vi로부터 vj까지의 방향 경로가 존재하고, vj로부터 vi로의 방향 경로가 존재하면 G는 강연결되어 있다고 한다. 강연결 컴포넌트(strongly connected component) 최대로 강 연결된 부분 그래프 예제: G는 강연결되어 있는가? 강연결된 컴포넌트는? 1 2 3

그래프 용어(8) 정점의 차수 1 2 3 정점의 차수는 그 정점에 부속된 간선들의 개수이다. 예제: G1에서 정점 0의 차수는? 방향 그래프에서, 정점 v의 진입 차수(in-degree)는 외부에서 들어 오는 간선의 개수이고, 진출 차수(out-degree)는 외부로 향하는 간선의 개수이다. 예제: G에서, 정점 2의 진입 차수 진출 차수 차수는? 1 2 3

그래프 ADT ∙객체: 정점의 집합과 간선의 집합 ∙연산: ▪ create_graph() ::= 그래프를 생성한다. ▪ init(g) ::= 그래프 g를 초기화한다. ▪ insert_vertex(g,v) ::= 그래프 g에 정점 v를 삽입한다. ▪ insert_edge(g,u,v) ::= 그래프 g에 간선 (u,v)를 삽입한다. ▪ delete_vertex(g,v) ::= 그래프 g의 정점 v와 그 모든 부속 간선을 삭제한다. ▪ delete_edge(g,u,v) ::= 그래프 g의 간선 (u,v)를 삭제한다. ▪ is_empty(g) ::= 그래프 g가 공백 상태인지 확인한다. ▪ adjacent(v) ::= 정점 v에 인접한 정점들의 리스트를 반환한다. ▪ destroy_graph(g) ::= 그래프 g를 제거한다. 그래프에 정점을 추가하려면 insert_vertex 연산을 사용하고 간선을 추가하려면 insert_edge 연산을 사용한다.

그래프 표현 방법 그래프를 표현하는 2가지 방법 인접행렬 방법 인접행렬(adjacent matrix): 2차원 배열 사용 표현 인접리스트(adjacency list): 연결리스트를 사용 표현 인접행렬 방법 G=(V, E), |V| = n이면, G의 인접행렬은 n*n 행렬 M M[i,j] = 1 iff (vi, vj) ∈E(G) <vi, vj> ∈E(G) for 방향 그래프 G = 0 iff otherwise 예제: G1의 인접행렬 표현은?

그래프 표현 방법: 인접 행렬 무방향 그래프에서 인접 행렬은 대칭적인가? 방향 그래프에서 인접행렬은 대칭적인가? 즉, (vi, vj) ∈E(G) iff (vj, vi) ∈E(G) 그렇다면, 행렬의 상위나 하위 삼각형 부분만 저장 가능 방향 그래프에서 인접행렬은 대칭적인가? G=(V, E), |V| = n일 때, 인접행렬 표현을 위한 필요한 메모리양은? ( ?bits) 두 정점 i, j간에 간선의 존재 여부를 어떻게 아는가? 정점 i의 차수를 어떻게 구하는가? G상에 존재하는 간선의 개수를 어떻게 구하는가?

그래프 표현 방법: 인접 행렬 다음 그래프의 인접 행렬 표현은? 1 2 3 진입 차수는 어떻게 구하는가? 진출 차수는 어떻게 구하는가? 1 2 3

그래프 표현: 인접 리스트 인접리스트 표현 … G=(V, E), |V| = n이면, n개의 연결리스트로 표현 각 정점에 대해서 한 개의 리스트 존재 정점 i의 리스트에 속한 노드들은 i에 인접한 정점들로 구성 노드 구조: (vertex, link) 각 리스트는 헤더 노드를 포함 예제: G1의 인접 리스트 표현은? Vi의 header Vi에 인접한 정점들 v1 link v2 link …

그래프 표현: 인접리스트 G=(V, E), |V| = n, |E| = e이면, G에 대한 인접리스트에서 헤더 노드의 개수는? 리스트의 노드 개수는? 두 정점 i, j간에 간선의 존재 여부를 어떻게 아는가? 정점 i의 차수를 어떻게 구하는가? G상에 존재하는 간선의 전체 개수를 어떻게 구하는가? 인접리스트는 희소 그래프(sparse graph) 표현에 적합

그래프 표현 방법: 인접 리스트 다음 그래프의 인접 리스트 표현은? 1 2 3 진입 차수는 어떻게 구하는가? 진출 차수는 어떻게 구하는가? 1 2 3

그래프 구현 다음 그래프 표현에 대해서 그래프 ADT를 구현하라.(교재 참고) 인접 행렬 #define MAX 50 ∙객체: 정점의 집합과 간선의 집합 ∙연산: ▪ create_graph() ::= 그래프를 생성한다. ▪ init(g) ::= 그래프 g를 초기화한다. ▪ insert_vertex(g,v) ::= 그래프 g에 정점 v를 삽입한다. ▪ insert_edge(g,u,v) ::= 그래프 g에 간선 (u,v)를 삽입한다. ▪ delete_vertex(g,v) ::= 그래프 g의 정점 v와 그 모든 부속 간선을 삭제한다. ▪ delete_edge(g,u,v) ::= 그래프 g의 간선 (u,v)를 삭제한다. ▪ is_empty(g) ::= 그래프 g가 공백 상태인지 확인한다. ▪ adjacent(v) ::= 정점 v에 인접한 정점들의 리스트를 반환한다. ▪ destroy_graph(g) ::= 그래프 g를 제거한다. #define MAX 50 typedef struct graphType { int n; // 정점 개수 int adjMat[MAX][MAX]; // 인접 행렬 } graphType void graphInit( graphType *g); void insetVertex(graphType *g, int vertex); void insetEdge(graphType *g, int u, int v);

그래프 연산: 인접 행렬 #define MAX 50 typedef struct graphType { int n; // 정점 개수 int adjMat[MAX][MAX]; // 인접 행렬 } graphType void graphInit( graphType *g) { int r, c; g->n = 0; for (r=0; r<MAX; r++) for (c=0; c<MAX; c++) g->adjMat[r][c] = 0; }

그래프 연산: 인접 행렬 #define MAX 50 typedef struct graphType { int n; // 정점 개수 int adjMat[MAX][MAX]; // 인접 행렬 } graphType void insetVertex(graphType *g, int vertex) { }

그래프 연산: 인접 행렬 #define MAX 50 typedef struct graphType { int n; // 정점 개수 int adjMat[MAX][MAX]; // 인접 행렬 } graphType void insetEdge(graphType *g, int start, int end) { }

그래프 구현 다음 그래프 표현에 대해서 그래프 ADT를 구현하라.(교재 참고) 인접 리스트 #define MAX 50 ∙객체: 정점의 집합과 간선의 집합 ∙연산: ▪ create_graph() ::= 그래프를 생성한다. ▪ init(g) ::= 그래프 g를 초기화한다. ▪ insert_vertex(g,v) ::= 그래프 g에 정점 v를 삽입한다. ▪ insert_edge(g,u,v) ::= 그래프 g에 간선 (u,v)를 삽입한다. ▪ delete_vertex(g,v) ::= 그래프 g의 정점 v를 삭제한다. ▪ delete_edge(g,u,v) ::= 그래프 g의 간선 (u,v)를 삭제한다. ▪ is_empty(g) ::= 그래프 g가 공백 상태인지 확인한다. ▪ adjacent(v) ::= 정점 v에 인접한 정점들의 리스트를 반환한다. ▪ destroy_graph(g) ::= 그래프 g를 제거한다. #define MAX 50 typedef struct graphNode { int vertex; // 정점 struct graphNode *link; } graphNode; typedef struct graphType { int n; // 정점 개수 graphNode * adjList[MAX]; } graphType; void graphInit(graphType *g); void insertVertex(graphType *g, int vertex); void insertEdge(graphType *g, int u, int v);

그래프 연산: 인접 리스트 #define MAX 50 Typedef struct GraphNode { int vertex; struct GraphNode *link; } GraphNode; typedef struct graphType { int n; // 정점 개수 GraphNode adjList[MAX]; // 인접 리스트 } graphType void graphInit( graphType *g) int v; g->n = 0; for (v=0; r<MAX; r++) g->adjList[v] = NULL: }

그래프 연산: 인접 리스트 #define MAX 50 Typedef struct GraphNode { int vertex; struct GraphNode *link; } GraphNode; typedef struct graphType { int n; // 정점 개수 GraphNode adjList[MAX]; // 인접 리스트 } graphType void insetVertex(graphType *g, int vertex) }

그래프 연산: 인접 리스트 #define MAX 50 Typedef struct GraphNode { int vertex; struct GraphNode *link; } GraphNode; typedef struct graphType { int n; // 정점 개수 GraphNode adjList[MAX]; // 인접 리스트 } graphType void insetEdge(graphType *g, int start, int end) }

Quiz 다음 그래프를 인접 행렬과 인접 리스트로 각각 표현하라. 1 2 3 4

문제 각 그래프 표현(인접 행렬, 인접 리스트)에 대해서, 다음을 구하는 알고리즘을 작성하라. 두 정점 i, j간에 간선의 존재 여부를 판단하라: 정점 i의 차수를 구하라: G상에 존재하는 간선의 전체 개수를 구하라: