제 6 장 그래프

27
제 6 제 제제제

description

제 6 장 그래프. 6.4 최단경로와 이행적 폐쇄. 6.4 최단경로와 이행적 폐쇄. A 로부터 B 로 가는 길이 있는가 ? A 로부터 B 로 가는길이 있다면 어느길이 짧은가 ? 최단경로 (shortest path) 단일 출발점 모든 도착지 (single source all destinations) v0(source) 에서 다른 모든 정점 ( 도착지 ) 까지의 최단경로 경로 길이의 증가순 ( 방향그래프에서 ). 6.4 최단경로와 이행적 폐쇄. 6.4 최단경로와 이행적 폐쇄. 가중치 (weight) - PowerPoint PPT Presentation

Transcript of 제 6 장 그래프

Page 1: 제 6 장 그래프

제 6 장 그래프

Page 2: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

Page 3: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

A 로부터 B 로 가는 길이 있는가 ? A 로부터 B 로 가는길이 있다면 어느길이

짧은가 ?

최단경로 (shortest path)– 단일 출발점 모든 도착지 (single source all destinati

ons)• v0(source) 에서 다른 모든 정점 ( 도착지 ) 까지의 최단경로• 경로 길이의 증가순 ( 방향그래프에서 )

Page 4: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

Page 5: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

가중치 (weight) – 양의 값 : adjacent : not adjacent

found[i] : if found[i]=TRUE->vi 까지의 최단경로 발견

distance[i] : v0 에서 S 내의 정점만을 거친 vi까지의 최단거리 (S= 최단경로가 발견된 정점의 집합 )– 초기치 : distance[i]=cost[0][i]– cost[i][j] : <i,j> 의 가중치

Page 6: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

그래프 : 비용인접행렬 (cost adjacency matrix) 로 표현

최단경로 i-k=(vi,…,vj,vk)

shortest + shortest => shortest

Page 7: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

Repeat(1) 다음 조건을 만족하는 i 를 찾음 found[i]=FA

LSE && distance[i] =min{distance[j]}, all j, found[j]=FALSE

(2) found[i]<-TRUE (S<-SU{vi})(3) 모든 j (found[j]=FALSE) 에 대해서 distance[j]<-min{distance[j],distance[i]+cost

[i][j]} (S 에 포함되지 않은 모든 distance 를 조정 )

Page 8: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

0 1 2 3 4 5

50 10 4515 10

20 1520 35

303

012345

cost 비용인접행렬

Page 9: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

vertex

distance

S

0

0

1

1

50

0

2

10

0

3

999

0

4

45

0

5

999

0

1. S={v0} : 초기는 공백

Page 10: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

vertex

distance

S

0

0

1

1

50

0

2

10

0

3

999

0

4

45

0

5

999

0

min

Page 11: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

vertex

distance

S

0

0

1

1

50

0

2

10

1

3

999

0

4

45

0

5

999

0

min

2. S=SU{v2} = {v0,v2}

Page 12: 제 6 장 그래프

2. S=SU{v2} = {v0,v2}– distance(1)<-min{distance(1),distance(2)+(v2,v1,999)} 50

– distance(3)<-min{distance(2),distance(2)+(v2,v3,15)} 25

– distance(4)<-min{distance(4),distance(2)+(v2,v4,999)} 45

– distance(5)<-min{distance(5),distance(2)+(v2,v5,999)} 999

vertex

distance

S

0

0

1

1

50

0

2

10

1

3

999

0

4

45

0

5

999

0

vertex

distance

S

0

0

1

1

50

0

2

10

1

3

25

0

4

45

0

5

999

0

Page 13: 제 6 장 그래프

3. S=SU{v3}={v0,v2,v3}– distance(1)<-min{distance(1),distance(3)+(v3,v1,20)} 45– distance(4)<-min{distance(4),distance(3)+(v3,v4,35)} 45– distance(5)<-min{distance(5),distance(3)+(v3,v5,999)} 999

vertex

distance

S

0

0

1

1

50

0

2

10

1

3

25

0

4

45

0

5

999

0

vertex

distance

S

0

0

1

1

45

0

2

10

1

3

25

1

4

45

0

5

999

0

Page 14: 제 6 장 그래프

4. S=SU{v1}={v0,v1,v2,v3}– Distance(4)<-min{distance(4),distance(1)+(v1,v4,10)} 45– Distance(5)<-min{distance(5),distance(3)+(v3,v5,999)} 999

vertex

distance

S

0

0

1

1

45

0

2

10

1

3

25

1

4

45

0

5

999

0

vertex

distance

S

0

0

1

1

45

1

2

10

1

3

25

1

4

45

0

5

999

0

Page 15: 제 6 장 그래프

5. S=SU{v4}={v0,v1,v2,v3,v4}– Distance(5)<-min{distance(5),distance(4)+(v3,v5,999)}999

vertex

distance

S

0

0

1

1

45

1

2

10

1

3

25

1

4

45

0

5

999

0

vertex

distance

S

0

0

1

1

45

1

2

10

1

3

25

1

4

45

1

5

999

0

Page 16: 제 6 장 그래프

vertex

distance

S

0

0

1

1

45

1

2

10

1

3

25

1

4

45

1

5

999

0

6. S=SU{v5}={v0,v1,v2,v3,v4,v5}

vertex

distance

S

0

0

1

1

45

1

2

10

1

3

25

1

4

45

1

5

999

1

Page 17: 제 6 장 그래프

void shortestpath(int v, int cost[][MAX_VERTICES], int distance[], int n, short int found[])

{/* distance[i] 는 정점 v 에서 i 로의 최단 경로 표현 , 정점 i 로부터 최단 경로가 발견되었으면 found[i] 는 1 이고 그렇지 않으면 0, cost 는 인접행렬 */int i, u, w;for(i=0;i<n;i++){

found[i]=FALSE;distance[i]=cost[v][i];

}found[v]=TRUE;distance[v]=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]+cost[u][w]<distance[w])

distance[w]=distance[u]+cost[u][w];}

}

Page 18: 제 6 장 그래프

int choose(int distance[], int n, short int found[]){

/* 아직 조사 안된 정점 중에서 distance 의 값이 최소인 것을 찾음 */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;

}

Page 19: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

모든쌍의 최단경로– 음수의 가중치를 가지는 사이클은 없음– 비용인접행렬cost[i][i]=0cost[i][j]=weight if <i,j>E(G)cost[I][j]= otherwise

A-1[i][j]=cost[i][j]Ak[i][j]=k 보다 더 큰 중간정점을 지나지 않는 i->j 최단경로An-1[i][j]=i->j 최단경로A-1, A0, A1,… An-1

Page 20: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

for k>=1, Ak[i][j]=min(Ak-1[i][j], Ak-1[i][k]= Ak-1[k][j]) A-1[i][j]= cost[i][j]

Page 21: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

0

6

3

4

0

11

2

0

0

1

2

0 1 2A-1

Page 22: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

063

40

1120

012

0 1 2A-1

063

407

1120

012

0 1 2A0k=0A0(0,1)=min{A-1(0,1), A-1(0,0)+A-

1(0,1)}A0(0,2)=min{A-1(0,2), A-1(0,0)+A-

1(0,2)}A0(1,0)=min{A-1(1,0), A-1(1,0)+A-

1(0,0)}A0(1,2)=min{A-1(1,2), A-1(1,0)+A-

1(0,2)}A0(2,0)=min{A-1(2,0), A-1(2,0)+A-

1(0,0)}A0(2,1)=min{A-1(2,1), A-1(2,0)+A-

1(0,1)}

Page 23: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

063

407

620

012

0 1 2A1

063

407

1120

012

0 1 2A0

053

407

620

012

0 1 2A2

Page 24: 제 6 장 그래프

void allcosts(int cost[][MAX_VERTICES], int distance[][MAX_VERTICES], int n)

{/* 각 정점에서 다른 모든 정점으로의 거리 계산 , cost 는 인접 행렬 , distance 는 거리값의 행렬 */int i,j,k;for (i=0;i<n;i++) for (j=0;j<n;j++)

distance[i][j]=cost[i][j];for (k=0;k<n;k++) for (i=0;i<n;i++)

for (j=0;j<n;j++) if distance[i][k]+distance[k][j]<distance[i][j])

distnace[i][j]=distance[i][k]+distance[k][j];}

Page 25: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

이행적폐쇄– 가중치 없는 방향그래프 G모든 i 와 j 에 대하여 i->j 의 경로 존재여부 결정– 이행적 폐쇄 (transitive closure): 양의 경로길이 요구– 반사 이행적 폐쇄 (reflexive transitive closure): 음이아닌 경로 길이만을 요구

Page 26: 제 6 장 그래프

6.4 최단경로와 이행적 폐쇄

[ 정의 ] 이행적폐쇄행렬 A+

방향그래프 G 에서 i->j 로의 길이 > 0 인 경로존재 : A+[i][j]=1

그렇지 않으면 :A+[i][j]=0

[ 정의 ] 반사 이행적폐쇄행렬 A*

방향그래프 G 에서 i->j 로의 길이 >= 0 인 경로존재 : A*[i][j]=1

그렇지 않으면 :A*[i][j]=0

Page 27: 제 6 장 그래프

과제물

최단경로 알고리즘 프로그래밍