슬라이드 1

Similar documents
슬라이드 1

슬라이드 1

슬라이드 1

1장. 리스트

Ch.8 Procedures and Environments

Chapter 10 그래프 (graph) SANGJI University Kwangman KO

11장.그래프

Microsoft PowerPoint - ch12 - Graph, Graph Algorithms

Chap 6: Graphs

Microsoft PowerPoint - ch12 - Graph, Graph Algorithms

Microsoft PowerPoint - 제10장-그래프.pptx

쉽게배우는알고리즘 9장. 그래프알고리즘

5장 스택

Chap 6: Graphs

제 6 장 그래프

선형자료구조 16.1 그래프 배열, 스택, 큐, 리스트를사용하여해결할수있다. 비선형자료구조 순환, 트리, 이진트리로복잡한문제를해결한다. 그래프 (graph) ; 인터넷과같은통신네트워크나고속도로나철도와같은교통네트워크에적합하다. 그래프 (graph) 링크에의해연결되어있는노

Chap 6: Graphs

Chapter 4. LISTS

chap 5: Trees

슬라이드 1

슬라이드 1

Let G = (V, E) be a connected, undirected graph with a real-valued weight function w defined on E. Let A be a set of E, possibly empty, that is includ

Chapter 4. LISTS

슬라이드 1

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

슬라이드 1

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

슬라이드 1

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

7장

06장.리스트

chap 5: Trees

서강대학교공과대학컴퓨터공학과 CSE3081 알고리즘설계와분석 (2 반 ) 기말고사 (2015 년 12 월 17 일 ) 알고리즘설계와분석 (CSE3081(2 반 )) 기말고사 (2015년 12월17일 ( 목 ) 오전 9시 30분 ) 담당교수 : 서강대학교컴퓨터공학과임인성

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Contents v 학습목표 자료구조큐에대한개념을스택과비교하여이해한다. 큐의특징과연산방법에대해알아본다. 순차표현방법을이용한큐와연결표현방법을이용한큐를구현해본다. 큐의응용방법을알아본다. v 내용 큐 큐의구현 큐의응용 2/74

슬라이드 1

11장 포인터

5.스택(강의자료).key

슬라이드 1

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Microsoft PowerPoint - 08-chap06-Queue.ppt

슬라이드 1

WISHBONE System-on-Chip Interconnection Architecture for Portable IP Cores

Microsoft PowerPoint - 07-chap05-Stack.ppt

Chapter 4. LISTS

슬라이드 1

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

Microsoft PowerPoint - 08-Queue.ppt

슬라이드 1

03_queue

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

쉽게 배우는 알고리즘 강의노트

Microsoft PowerPoint Greedy Method.ppt

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item0, item1,..., item -1) l 리스트의예 l 요일 : ( 일요일, 월요일,, 토요일 ) l 한글자음의모임 : ( ㄱ, ㄴ

1장. 리스트

Microsoft PowerPoint - slide05.pptx

슬라이드 1

슬라이드 1

Algorithms


chap x: G입력

슬라이드 1

Microsoft PowerPoint - 제3장-배열.pptx

Infinity(∞) Strategy

슬라이드 1

완벽한개념정립 _ 행렬의참, 거짓 수학전문가 NAMU 선생 1. 행렬의참, 거짓개념정리 1. 교환법칙과관련한내용, 는항상성립하지만 는항상성립하지는않는다. < 참인명제 > (1),, (2) ( ) 인경우에는 가성립한다.,,, (3) 다음과같은관계식을만족하는두행렬 A,B에

2002년 2학기 자료구조

슬라이드 1

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Data structure: Assignment 3 Seung-Hoon Na December 14, 2018 레드 블랙 트리 (Red-Black Tree) 1 본 절에서는 레드 블랙 트리를 2-3트리 또는 2-3-4트리 대한 동등한 자료구조로 보고, 두 가지 유형의 레

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C0DAB7E1B1B8C1B65FC3E2BCAEBCF6BEF7>

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint Branch-and-Bound.ppt

Algorithms

o 스택 (stack) ~ 쌓아놓은더미 1. 스택의개요 - 2 -

중간고사 (자료 구조)

Microsoft PowerPoint - chap11-포인터의활용.pptx

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

PowerPoint 프레젠테이션

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

슬라이드 1

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - chap-11.pptx

02장.배열과 클래스

중간고사

Microsoft PowerPoint - ch07 - 포인터 pm0415

01장.자료구조와 알고리즘

untitled

08장.트리

04장.큐

C 언어 강의노트

슬라이드 1

Microsoft PowerPoint - 제11장 포인터

K&R2 Reference Manual 번역본

Frama-C/JESSIS 사용법 소개

4장

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Transcription:

CHAP 10 : 그래프

그래프 (graph) 연결되어있는객체간의관계를표현하는자료구조 가장일반적인자료구조형태 우리가배운트리 (tree) 도그래프의특수한경우임 전기회로의소자간연결상태 운영체제의프로세스와자원관계 큰프로젝트에서작은프로젝트간의우선순위 지도에서도시들의연결상태

그래프역사 1800 년대오일러에의하여창안 오일러문제 모든다리를한번만건너서처음출발했던장소로돌아오는문제 A,B,C,D 지역의연결관계표현 위치 : 정점 (node) 다리 : 간선 (edge) 오일러정리 모든정점에연결된간선의수가짝수이면오일러경로존재함 따라서그래프 (b) 에는오일러경로가존재하지않음

그래프정의 그래프 G는 (V, E) 로표시 정점 (vertices) 여러가지특성을가질수있는객체의미 V(G) : 그래프 G의정점들의집합 노드 (node) 라고도불림 간선 (edge) 정점들간의관계의미 E(G) : 그래프 G의간선들의집합 링크 (link) 라고도불림

그래프의종류 무방향그래프 (undirected graph) 무방향간선 (undirected edge) 만사용 간선을통해서양방향으로갈수있음 도로의왕복통행길 (A, B) 와같이정점의쌍으로표현 (A, B) = (B, A) A B 방향그래프 (directed graph) 방향간선 (undirected edge) 만사용 간선을통해서한쪽방향으로만갈수있음 도로의일방통행길 <A, B> 와같이정점의쌍으로표현 <A, B> <B, A> A B

가중치그래프 가중치그래프 (weighted graph) 는네트워크 (network) 라고도함 간선에비용 (cost) 이나가중치 (weight) 가할당된그래프 A 1200 B 가중치그래프예 정점 : 각도시를의미 간선 : 도시를연결하는도로의미 가중치 : 도로의길이

그래프표현의예 V(G1)= {0, 1, 2, 3, E(G1)= {(0, 1), (0, 2), (0, 3), (1, 2), (2, 3) V(G2)= {0, 1, 2, 3, E(G3)= {(0, 1), (0, 2)) V(G2)= {0, 1, 2, E(G2)= {<0, 1>, <1, 0>, <1, 2>

부분그래프 (subgraph) 정점집합 V(G) 와간선집합 E(G) 의부분집합으로이루어진그래프 그래프 G1 의부분그래프들

인접정점 (adjacent vertex) 그래프 하나의정점에서간선에의해직접연결된정점 G1에서정점 0의인접정점 : 정점 1, 정점 2, 정점 3 무방향그래프의차수 (degree) 하나의정점에연결된다른정점의수 G1에서정점 0의차수 : 3 무방향그래프의모든차수의합은간선수의 2배 G1의차수의합 : 10 G1의간선의합 : 5

방향그래프의차수 (degree) 그래프 진입차수 (in-degree) : 외부에서오는간선의수 진출차수 (out-degree) : 외부로향하는간선의수 G3에서정점 1의차수 : 내차수 1, 외차수 2 방향그래프의모든진입 ( 진출 ) 차수의합은간선의수 G3의진입차수의합 : 3 G3의진입차수의합 : 3 G3의간선합 : 3

그래프의경로 (path) 무방향그래프의정점 s 로부터정점 e 까지의경로 정점의나열 s, v1, v2,..., vk, e 나열된정점들간에반드시간선 (s, v1), (v1, v2),..., (vk, e) 존재 방향그래프의정점 s 로부터정점 e 까지의경로 정점의나열 s, v1, v2,..., vk, e 나열된정점들간에반드시간선 <s, v1>, <v1, v2>,...,<vk, e> 존재 경로의길이 (length) 경로를구성하는데사용된간선의수 단순경로 (simple path) 경로중에서반복되는간선이없는경로 사이클 (cycle) 단순경로의시작정점과종료정점이동일한경로

그래프의경로 (path) G1의 0, 1, 2,3은경로지만 0, 1, 3, 2는경로아님 G1의1, 0, 2, 3은단순경로이지만 1, 0, 2, 0은단순경로아님 G1의 0, 1, 2, 0과 G3의 0, 1, 0은사이클

그래프의연결정도 연결그래프 (connected graph) 무방향그래프 G에있는모든정점쌍에대하여항상경로존재 G2는비연결그래프임 트리 (tree) 그래프의특수한형태로서사이클을가지지않는연결그래프 트리의예

그래프의연결정도 완전그래프 (complete graph) 모든정점이연결되어있는그래프 n개의정점을가진무방향완전그래프의간선의수 : n (n-1)/2 n=4, 간선의수 = (4 3)/2 = 6

그래프 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 연산사용

그래프표현방법 인접행렬 (adjacent matrix) 방법 if( 간선 (i, j) 가그래프에존재 ) M[i][j] = 1, 그렇지않으면 M[i][j] = 0. 인접행렬의대각선성분은모두 0( 자체간선불허 ) 무방향그래프의인접행렬은대칭

그래프표현방법 (cont.) 인접리스트 (adjacency list) 방법 각정점에인접한정점들을연결리스트로표현

그래프탐색 그래프의가장기본적인연산 하나의정점으로부터시작하여차례대로모든정점들을한번씩방문 많은문제들이단순히그래프의노드를탐색하는것으로해결 ( 예 ) 도로망에서특정도시에서다른도시로갈수있는지여부 ( 예 ) 전자회로에서특정단자와다른단자가서로연결되어있는지여부

깊이우선탐색 (DFS) 깊이우선탐색 (DFS: depth-first search) 한방향으로갈수있을때까지가다가더이상갈수없게되면가장가까운갈림길로돌아와서이곳으로부터다른방향으로다시탐색진행 되돌아가기위해서는스택필요 ( 순환함수호출로묵시적인스택이용가능 )

DFS 알고리즘 depth_first_search(v) v 를방문되었다고표시 ; for all u (v 에인접한정점 ) do if (u 가아직방문되지않았으면 )then depth_first_search(u)

DFS 프로그램 // 인접행렬로표현된그래프에대한깊이우선탐색 void dfs_mat(graphtype *g, int v) { int w; visited[v] = TRUE; // 정점 v의방문표시 printf("%d ", v); // 방문한정점출력 for(w=0; w<g->n; w++) // 인접정점탐색 if( g->adj_mat[v][w] &&!visited[w] ) dfs_mat(g, w); // 정점 w에서 DFS 새로시작 // 인접리스트로표현된그래프에대한깊이우선탐색 void dfs_list(graphtype *g, int v) { GraphNode *w; visited[v] = TRUE; // 정점 v 의방문표시 printf("%d ", v); // 방문한정점출력 for(w=g->adj_list[v]; w; w=w->link) // 인접정점탐색 if(!visited[w->vertex]) dfs_list(g, w->vertex); // 정점 w 에서 DFS 새로시작

너비우선탐색 (BFS) 너비우선탐색 (BFS: breadth-first search) 시작정점으로부터가까운정점을먼저방문하고멀리떨어져있는정점을나중에방문하는순회방법 큐를사용하여구현됨 너비우선탐색알고리즘 breadth_first_search(v) v 를방문되었다고표시 ; 큐 Q 에정점 v 를삽입 ; while (not is_empty(q)) do Q 에서정점 w 를삭제 ; for all u (w 에인접한정점 ) do if (u 가아직방문되지않았으면 ) then u 를큐에삽입 ; u 를방문되었다고표시 ;

BFS 프로그램 ( 인접행렬 ) void bfs_mat(graphtype *g, int v) { int w; QueueType q; init(&q); visited[v] = TRUE; printf("%d ", v); enqueue(&q, v); while(!is_empty(&q)){ // 큐초기화 // 정점 v 방문표시 // 정점출력 // 시작정점을큐에저장 v = dequeue(&q); // 큐에정점추출 for(w=0; w<g->n; w++) // 인접정점탐색 if(g->adj_mat[v][w] &&!visited[w]){ visited[w] = TRUE; printf("%d ", w); enqueue(&q, w); // 방문표시 // 정점출력 // 방문한정점을큐에저장

BFS 프로그램 ( 인접리스트 ) void bfs_list(graphtype *g, int v) { GraphNode *w; QueueType q; init(&q); visited[v] = TRUE; printf("%d ", v); enqueue(&q, v); while(!is_empty(&q)){ // 큐초기화 // 정점 v 방문표시 // 정점 v 출력 // 시작정점을큐에저장 v = dequeue(&q); // 큐에서정점추출 for(w=g->adj_list[v]; w; w = w->link) // 인접정점탐색 if(!visited[w->vertex]){ // 미방문정점탐색 visited[w->vertex] = TRUE; // 방문표시 printf("%d ", w->vertex); // 정점출력 enqueue(&q, w->vertex); // 방문한정점을큐에삽입

연결성분 최대로연결된부분그래프들 DFS 또는 BFS 반복이용 DFS 또는 BFS 탐색프로그램의 visited[v]=true; 를 visited[v]=count; 로교체 void find_connected_component(graphtype *g) { int i; count = 0; for(i=0; i<g->n; i++) if(!visited[i]){ // 방문되지않았으면 count++; dfs_mat(g, i);

신장트리 (spanning tree) 그래프내의모든정점을포함하는트리 모든정점들이연결되어있어야하고사이클을포함해서는안됨 n개의정점을가지는그래프의신장트리는 n-1개의간선을가짐 최소의링크를사용하는네트워크구축시사용 : 통신망, 도로망, 유통망등 신장트리알고리즘 depth_first_search(v) v를방문되었다고표시 ; for all u (v에인접한정점 ) do if (u가아직방문되지않았으면 ) then (v,u) 를신장트리간선이라고표시 ; depth_first_search(u);

신장트리

최소비용신장트리 (MST: minimum spanning tree) 네트워크에있는모든정점들을가장적은수의간선과비용으로연결 MST의응용 도로건설 - 도시들을모두연결하면서도로의길이를최소가되도록하는문제 전기회로 - 단자들을모두연결하면서전선의길이를가장최소로하는문제 통신 - 전화선의길이가최소가되도록전화케이블망을구성하는문제 배관 - 파이프를모두연결하면서파이프의총길이를최소로하는문제

Kruskal 의 MST 알고리즘 탐욕적인방법 (greedy method) 주요알고리즘설계기법 각단계에서최선의답을선택하는과정을반복함으로써최종적인해답에도달 탐욕적인방법은항상최적의해답을주는지검증필요 Kruskal MST 알고리즘은최적의해답임이증명됨

Kruskal 의 MST 알고리즘 MST 는최소비용의간선으로구성됨과동시에사이클을포함하지않아야함 각단계에서사이클을이루지않는최소비용간선선택 그래프의간선들을가중치의오름차순으로정렬 정렬된간선중에서사이클을형성하지않는간선을현재의 MST 집합에추가 만약사이클을형성하면그간선은제외

Kruskal 의 MST 알고리즘 union-find 알고리즘 두집합들의합집합만듬 원소가어떤집합에속하는지알아냄 Kruskal의 MST 알고리즘에서사이클검사에사용 a 와 b 가같은집합에속함 a 와 b 가다른집합에속함

union-find 프로그램 int parent[max_vertices]; int num[max_vertices]; void set_init(int n) {int i; for(i=0;i<n;i++){ parent[i] = -1; num[i] = 1; int set_find(int vertex) {int p, s, i=-1; for(i=vertex;(p=parent[i])>=0;i=p) ; s = i; for(i=vertex;(p=parent[i])>=0;i=p) parent[i] = s; return s; // 부모노드 // 각집합의크기 // 초기화 // vertex가속하는집합반환 // 루트노드까지반복 // 집합의대표원소 // 집합의모든원소들의부모를 s로설정 void set_union(int s1, int s2) if( num[s1] < num[s2] ){ parent[s1] = s2; num[s2] += num[s1]; else { parent[s2] = s1; num[s1] += num[s2]; // 두개의원소가속한집합을합함

Kruskal 의 MST 프로그램 #include <stdio.h> #define MAX_VERTICES 100 #define INF 1000 // 프로그램 10.7의 union-find 프로그램삽입 //... // 히프의요소타입정의 typedef struct { int key; int u; // 정점 1 int v; // 정점 2 // 간선의가중치 element; // 프로그램 8.5 중에서최소히프프로그램삽입 //... // 정점 u와정점 v를연결하는가중치가 weight인간선을히프에삽입 void insert_heap_edge(heaptype *h, int u, int v, int weight) { element e; e.u = u; e.v = v; e.key = weight; insert_min_heap(h, e); // 인접행렬이나인접리스트에서간선들을읽어서최소히프에삽입 // 현재는예제그래프의간선들을삽입한다. void insert_all_edges(heaptype *h){ insert_heap_edge(h,0,1,29); insert_heap_edge(h,1,2,16); insert_heap_edge(h,2,3,12); insert_heap_edge(h,3,4,22); insert_heap_edge(h,4,5,27); insert_heap_edge(h,5,0,10); insert_heap_edge(h,6,1,15); insert_heap_edge(h,6,3,18); insert_heap_edge(h,6,4,25); C 로쉽게풀어쓴자료구조 생능출판사 2011

Kruskal 의 MST 프로그램 (cont.) // kruskal의최소비용신장트리프로그램 void kruskal(int n) { int edge_accepted=0; // 현재까지선택된간선의수 HeapType h; // 최소히프 int uset, vset; // 정점 u와정점 v의집합번호 element e; // 히프요소 init(&h); // 히프초기화 insert_all_edges(&h); // 히프에간선들을삽입 set_init(n); // 집합초기화 while( edge_accepted < (n-1) ) // 간선의수 < (n-1) { e = delete_min_heap(&h); // main() { kruskal(7); uset = set_find(e.u); vset = set_find(e.v); if( uset!= vset ){ // 최소히프에서삭제 // 정점 u의집합번호 // 정점 v의집합번호 // 서로속한집합이다르면 printf("(%d,%d) %d \n",e.u, e.v, e.key); edge_accepted++; set_union(uset, vset); // 두개의집합을합친다.

Kruskal 의 MST 알고리즘복잡도 Kruskal 알고리즘은대부분간선들을정렬하는시간에좌우됨 사이클테스트등의작업은정렬에비해매우신속하게수행됨 네트워크의간선 e 개를퀵정렬과같은효율적인알고리즘으로정렬한다면 Kruskal 알고리즘의시간복잡도는 O(e*log(e)) 가된다

Prim 의 MST 알고리즘 시작정점에서부터출발하여신장트리집합을단계적으로확장해나감 시작단계에서는시작정점만이신장트리집합에포함됨 신장트리집합에인접한정점중에서최저간선으로연결된정점선택하여신장트리집합에추가함 이과정은신장트리집합이 n-1 개의간선을가질때까지반복 간선 (a, b)=29 간선 (f, e)=27 간선 (f, e) 선택 정점 e 가신장트 리집합에추가됨

Prim 의 MST 알고리즘

Prim 의 MST 프로그램 #include <stdio.h> #define TRUE 1 #define FALSE 0 #define MAX_VERTICES 7 #define INF 1000L int weight[max_vertices][max_vertices]={ { 0, 29, INF, INF, INF, 10, INF, { 29, 0, 16, INF, INF, INF, 15, { INF, 16, 0, 12, INF, INF, INF, { INF, INF, 12, 0, 22, INF, 18, { INF, INF, INF, 22, 0, 27, 25, { 10, INF, INF, INF, 27, 0, INF, { INF, 15, INF, 18, 25, INF, 0 ; int selected[max_vertices]; int dist[max_vertices]; // 최소 dist[v] 값을갖는정점을반환 int get_min_vertex(int n) { int v,i; for (i = 0; i <n; i++) if (!selected[i]) { v = i; break; for (i = 0; i < n; i++) if (!selected[i] && (dist[i] < dist[v])) v = i; return (v);

Prim 의 MST 프로그램 (cont.) void prim(int s, int n) { int i, u, v; for(u=0;u<n;u++) dist[u]=inf; dist[s]=0; for(i=0;i<n;i++){ u = get_min_vertex(n); selected[u]=true; if( dist[u] == INF ) return; printf("%d ", u); for( v=0; v<n; v++) if( weight[u][v]!= INF) if(!selected[v] && weight[u][v]< dist[v] ) dist[v] = weight[u][v]; // main() { prim(0, MAX_VERTICES);

Prim 의 MST 알고리즘복잡도 주반복문이정점의수 n 만큼반복하고, 내부반복문이 n 번반복하므로 Prim 의알고리즘은 O(n2) 의복잡도를가진다. 희박한그래프 O(e*log(e)) 인 Kruskal 의알고리즘이유리 밀집한그래프 O(n 2 ) 인 Prim 의알고리즘이유리

최단경로 (shortest path) 네트워크에서정점 u 와정점 v 를연결하는경로중에서간선들의가중치합이최소가되는경로 간선의가중치는비용, 거리, 시간등 정점 0 에서정점 3 으로가는최단경로문제 인접행렬에서간선이없는노드쌍의가중치는 임 0,4,1,2,3 이최단경로 최단경로길이는 3+2+4+2=11

Dijkstra 의최단경로알고리즘 하나의시작정점으로부터모든다른정점까지의최단경로찾음 집합 S 시작정점 v 로부터의최단경로가이미발견된정점들의집합 distance 배열 최단경로가알려진정점들만을이용한다른정점들까지의최단경로길이 distance 배열의초기값 ( 시작정점 v) distance[v] = 0 다른정점에대한 distance 값은시작정점과해당정점간의가중치값 매단계에서가장 distance 값이작은정점을 S 에추가

Dijkstra 의최단경로알고리즘 distance 값이가장작은정점을 u 라고하자. 그러면시작정점 v 에서정점 u 까지의최단거리는경로 1 이된다. 정점 w 를거쳐서정점 u 로가는가상적인더짧은경로가있다고가정해보자. 그러면정점 v 에서정점 u 까지의거리는정점 v 에서정점 w 까지의거리 2 와정점 w 에서정점 u 로가는거리 3 을합한값이된다. 그러나경로 2 는경로 1 보다항상길수밖에없다. 왜냐하면현재 distance 값이가장작은정점은 u 이기때문이다. 따라서매단계에서 distance 값이가장작은정점들을추가해나가면시작정점에서모든정점까지의최단거리를구할수있다.

Dijkstra 의최단경로알고리즘 새로운정점이 S 에추가되면 distance 값갱신

Dijkstra 의최단경로알고리즘 // 입력 : 가중치그래프 G, 가중치는음수가아님. // 출력 : distance 배열, distance[u] 는 v 에서 u 까지의최단거리이다. shortest_path(g, v) S {v for 각정점 w G do distance[w] weight[v][w]; while 모든정점이 S에포함되지않으면 do u 집합 S에속하지않는정점중에서최소 distance 정점 ; S S {u for u에인접하고 S에있는각정점 z do if distance[u]+weight[u][z] < distance[z] then distance[z] distance[u]+weight[u][z];

Dijkstra 의최단경로알고리즘

Dijkstra 의최단경로알고리즘

Dijkstra 의최단경로프로그램 #include <stdio.h> #include <limits.h> #define TRUE 1 #define FALSE 0 #define MAX_VERTICES 7 // 정점의수 #define INF 1000 // 무한대 ( 연결이없는경우 ) int weight[max_vertices][max_vertices]={ // 네트워크의인접행렬 { 0, 7, INF, INF, 3, 10, INF, { 7, 0, 4, 10, 2, 6, INF, { INF, 4, 0, 2, INF, INF, INF, { INF, 10, 2, 0, 11, 9, 4, { 3, 2, INF, 11, 0, INF, 5, { 10, 6, INF, 9, INF, 0, INF, { INF, INF, INF, 4, 5, INF, 0 ; int distance[max_vertices]; // 시작정점으로부터의최단경로거리 int found[max_vertices]; // 방문한정점표시 // int choose(int distance[], int n, int found[]) { int i, min, minpos; min = INT_MAX; minpos = -1; for(i=0;i<n;i++) if( distance[i]< min &&! found[i] ){ min = distance[i]; minpos=i; return minpos;

Dijkstra 의최단경로프로그램 (cont.) void shortest_path(int start, int n) { int i, u, w; for(i=0; i<n; i++) // 초기화 {distance[i] = weight[start][i]; found[i] = FALSE; found[start] = TRUE; // 시작정점방문표시 distance[start] = 0; for(i=0; i<n-2; i++){ u = choose(distance, n, found); found[u] = TRUE; for(w=0;w<n; w++) if(!found[w]) if( distance[u]+weight[u][w]<distance[w] ) distance[w] = distance[u]+weight[u][w]; // void main() { shortest_path(0, MAX_VERTICES);

Dijkstra 의최단경로알고리즘복잡도 네트워크에 n 개의정점이있다면, Dijkstra 의최단경로알고리즘은주반복문을 n 번반복하고내부반복문을 2n 번반복하므로 O(n 2 ) 의복잡도를가진다.

Floyd 의최단경로알고리즘 모든정점사이의최단경로를찾음 2차원배열 A를이용하여 3중반복을하는루프로구성 인접행렬 weight 구성 i==j이면, weight[i][j]=0 두개의정점 i,j 사이에간선이존재하지않으면, weight[i][j]= 정점 i,j 사이에간선이존재하면, weight[i][j] 는간선 (i, j) 의가중치 배열 A의초기값은인접행렬 weight임 floyd(g) for k 0 to n - 1 for i 0 to n - 1 for j 0 to n - 1 A[i][j] = min(a[i][j], A[i][k] + A[k][j])

Floyd 의최단경로알고리즘 A k [i][j] 0 부터 k 까지의정점만을이용한정점 i 에서 j 까지의최단경로길이 A -1 A 0 A 1 A n-1 순으로최단경로구해감 A k-1 까지구해진상태에서 k 번째정점이추가로고려되는상황을생각하자 0 부터 k 까지의정점만을사용하여정점 i 에서정점 j 로가는최단경로는다음의 2 가지의경우로나뉘어진다. 정점 k 를거치지않는경우 : A k [i][j] 는 k 보다큰정점은통과하지않으므로최단거리는여전히 A k-1 [i][j]] 임 정점 k 를거치는경우 : i 에서 k 까지의최단거리 A k-1 [i][k] 에 k 에서 j 까지의최단거리 A k-1 [k][j] 를더한값

Floyd 의최단경로프로그램 int A[MAX_VERTICES][MAX_VERTICES]; void floyd(int n) { int i, j, k; for(i=0; i<n; i++) for(j=0; j<n; j++) A[i][j]=weight[i][j]; for(k=0; k<n; k++) for(i=0; i<n; i++) for(j=0; j<n; j++) if (A[i][k]+A[k][j] < A[i][j]) A[i][j] = A[i][k]+A[k][j];

Floyd 의최단경로알고리즘복잡도 네트워크에 n 개의정점이있다면, Floyd 의최단경로알고리즘은 3 중반복문을실행되므로시간복잡도는 O(n 3 ) 이된다 모든정점쌍의최단경로를구하려면 Dijkstra 의알고리즘 O(n 2 ) 을 n 번반복해도되며, 이경우전체복잡도는 O(n 3 ) 이된다 모든정점쌍의최단경로를구하는데있어두알고리즘모두동일한 O(n 3 ) 의복잡도를가지지만 Floyd 의알고리즘은매우간결한반복구문을사용하므로 Dijkstra 의알고리즘보다효율적이다

위상정렬 (topological sort) 방향그래프에서간선 <u, v> 가있다면정점 u 는정점 v 를선행함 방향그래프정점들의선행순서를위배하지않으면서모든정점을나열 선수과목은과목들의선행관계표현함 과목번호 과목명 선수과목 0 전산학개론 없음 1 이산수학 없음 2 자료구조 1 3 알고리즘분석 0, 1, 2 4 운영체제 1 5 인공지능 2, 3, 4 위상순서 (topological order) (0,1,2,3,4,5), (1,0,2,3,4,5) (2,0,1,3,4,5) 는위상순서가아님 왜냐하면 2 번정점이 0 번정점앞에오기때문

위상정렬알고리즘 Input: 그래프 G=(V,E) Output: 위상정렬순서 topo_sort(g) for i 0 to do if( 모든정점이선행정점을가지면 ) then 사이클이존재하고위상정렬불가 ; 선행정점을가지지않는정점 v 선택 ; v 를출력 ; v 와 v 에서나온모든간선들을그래프에서삭제 ;

위상정렬의예

위상정렬프로그램 void topo_sort(graphtype *g) { int i; StackType s; GraphNode *node; // 모든정점의진입차수를계산 int *in_degree = (int *)malloc(g->n* sizeof(int)); for(i = 0; i < g->n; i++) // 초기화 in_degree[i] = 0; for(i = 0; i < g->n; i++){ GraphNode *node = g->adj_list[i]; while ( node!= NULL ) { In_degree[node->vertex]++; node = node->link; // 정점 i 에서나오는간선들

위상정렬프로그램 (cont.) // 진입차수가 0인정점을스택에삽입 init(&s); for(i = 0; i < g->n; i++){ if( in_degree[i] == 0 ) push(&s, i); // 위상순서를생성 while(!is_empty(&s)){ int w; w = pop(&s); printf("%d", w); node = g->adj_list[w]; while (node!= NULL) { int u = node->vertex; in_degree[u]--; if(in_degree[u] == 0) push(&s, u); node = node->link; free(in_degree); return; // 반환값이 1 이면성공, 0 이면실패 // 각정점의진입차수를변경 // 진입차수를감소 // 다음정점