15
Project #5: Project #5: 통통통통통 통 통통 통통통통통 통 통통 통 : D3 통통 : 2011 정정정 통통 : 2008 정정정 2009 정정정 2011 정정정 2011 정정정

이산치수학 Project5

Embed Size (px)

Citation preview

Page 1: 이산치수학 Project5

Project #5: Project #5:

통신망에서 길 찾기통신망에서 길 찾기

조 : D3

조장 : 2011 정진아

조원 : 2008 고충욱

2009 김시백

2011 안영준

2011 최보은

Page 2: 이산치수학 Project5

차 례

1. 프로젝트 설명

2. 일 정

3. 업무분담

4. 소 스

5. 회의록

Page 3: 이산치수학 Project5

1. 프로젝트 설명

directed graph(방향그래프)

한 쌍의 노드간에 방향성을 갖는 에지로 연결된 그래프를 소위 방향성 그래프

(directed graph: Digraph)라 하는데, 이는 모든 에지에 대하여 한 쌍의 노드가

정돈되어 있는 그래프이다. 즉 v1, v2∈V ⇒ (v1, v2)≠(v2, v1)의 특성을 갖는

그래프이다. 이때 (v1, v2)에서 v1 은 v2 의 꼬리(tail)라하고, v2 는 v1 의 머리

(head)라 한다.

<그림-1> 그래프의 유형

출처 : rohhy.kangwon.ac.kr/attachment/1288774889.hwpprecedes / antecedent(선조)

트리(tree)의 특정한 노드에 대해 관계가 있는 노드들을 나타내는 용어. 여기서 특정

노드의 선조는 트리의 근 노드에서 해당 노드까지의 경로 상에 있는 모든 노드를

말한다.

출처 : http://terms.naver.com/entry.nhn?docId=815129

indegree

외부에서 내부로 들어오는 간선들의 수outdegree

내부에서 외부로 들어오는 간선들의 수source내부에서 외부로 나가는 간선들만 존재

sink외부에서 내부로 들어오는 간선들만 존재

Page 4: 이산치수학 Project5

adjacency matrix(인접 행렬)

인접 행렬은 정점의 개수가 N 일 때, 정점 i 와 정점 j 사이의 가중치를 N×N 의 2차원행렬 M 의 (i,j)에 저장한다.

그래프의 각 노드에 일련번호를 부여하고, 일련번호에 의한 노드들을 그래프의

노드집합으로 관찰한다. 그리고 그래프의 에지는 노드의 수에 대한 정방형 행렬에서

행과 열이 만나는 원소로 나타냄으로써 그래프를 구현할 수 있다. 이에 따라 에지는

정방형 행렬에서 다음과 같이 표기할 수 있다.

A(i, j) = 1 : (vi, vj)∈E 의 경우

A(i, j) = 0 : (vi, vj)∉E 의 경우

이에 대해 인접행렬에 의한 그래프는 다음과 같이 구현한다.

class Graph

{ int edge[max][max]; // 에지의 집합

}

예를 들어 그림-5.1 의 방향성 그래프 2)를 인접행렬로 구현하면, 에지는 다음과 같이

정방형 행렬로 작성한다.

0 1 2

0 0 1 01 1 0 12 0 0 0

[그림-5.7] 인접행렬

//인접행렬을 통한 그래프 생성과 출력

#include <iostream.h>

Page 5: 이산치수학 Project5

const int max=3;

class Graph

{ int edge[max][max]; // 에지의 집합

public:

void build()

{ int n;

for (int i=0; i<max; i++)

for (int j=0; j<max; j++)

{ cin>>n;

edge[i][j]=n;

}

}

//그래프의 에지를 (a, b)의 형태로 출력

void display()

{ for (int i=0; i<max; i++)

for (int j=0; j<max; j++)

{ if (edge[i][j]==1)

cout<<"("<<i<<", "<<j<<") ";

}

}

};

void main()

{ Graph *obj=new Graph();

obj->build();

obj->display();

}

//입력자료: 0 1 0 1 0 1 0 0 0

//출력결과: (0, 1) (1, 0) (1, 2)

Page 6: 이산치수학 Project5

인접행렬로 그래프를 구현할 경우 한 노드에 접근하는데 요구되는 시간은 노드의

수에 따라 결정된다. 그러나 인접행렬로 구현된 그래프는 접근시간이 짧기 때문에

에지가 존재하는지 자주 알 필요가 있을 때 유용하다.

인접행렬에 의한 방향성 그래프는 n2 보다 적은 에지를 갖은 경우일지라도 에지를

구성하기 위해 n2 에 해당하는 메모리를 필요로 한다. 뿐만 아니라 한 노드를

탐색하는데 소요되는 시간은 노드의 수 n 에 관련 O(n2)에 달한다.

한편 비방향성 그래프인 경우에는 행렬의 대각선을 중심으로 에지의 관계가 대칭을

이루기 때문에 에지가 중복해서 표기된다. 이에 따라 그래프를 구현할 때,

기억장소를 절약하려면 이미 배열에서 다루었던 삼각행렬(triangular matrix)이나,

희소행렬(sparse matrix)을 이용할 수 있다. 이때 만약 비방향성 그래프를

삼각행렬로 구현한다면 그래프의 탐색시간은 O(n*(n-1)/2)에 달하게 될 것이다.

출처 : http://webedu.ksc.re.kr/graduate_new/data/final_group18.pdfrohhy.kangwon.ac.kr/attachment/1288774889.hwppath(경로) / length(길이)

그래프 G 에서 한 쌍의 노드 v0, vn∈V 에서, n≥0 이고, 모든 0≤i≤n 에 대하여 에지

(vi, vi+1)∈E 가 존재하면, 일련의 노드(v0, v1, ...., vn)을 v0 에서 vn 에 이르는 n

길이(length)의 경로(path)라 한다.

예를 들면 그림-1 의 2)에서 (a, b, c)는 길이가 2 인 경로이다. 이러한 경로개념은

도로망, 교통망, 통신망 등에서 자주 응용되고 있다.

출처 : rohhy.kangwon.ac.kr/attachment/1288774889.hwpreachability matrix(도달행렬)

E 에 대한 인접행렬이 A 이고 E*에 대한 인접행렬이 A*일 때 A*은 아래의 식으로 계산되며 이를G 에 대한 도달행렬(reachability matrix)이라고 한다.

nAAAA ...2*

출처 : chiwoos.tistory.com/attachment/499a1f051d1269L.pptweighted digraph(가중치그래프)가 간선에 값을 부여한 그래프이고, weight of a path(가중치 그래프 내의 경로의 길이)는 경로 안의 간선의 가중치의 합이라는 것이다. edge(간선) 의 가중치를 로 표기한다.

Page 7: 이산치수학 Project5

탐색트리에서 경로를 정하는 노드의 키 값처럼 그래프를 순행할 때 경로선택의

기준을 제공하는 것으로 에지의 특성을 나타내는 가중치를 가질 수 있는데 보통

그래프를 구성하는 에지의 가중치는 복합적인 에지의 속성 값으로 해석된다.

인접 행렬에서 그래프 G=(V, E, W)의 가중치는 다음과 같이 정의한다.

A[i, j] = w(vi, vj) : (vi, vj)∈E 의 경우 에지의 특성을 가중치로 두 노드 vi, vj

간의 인접관계를 나타낸다.

A[i, j] = c : 그 밖의 경우 임의의 값으로 노드간에 관계가 없음을 나타낸다.

앞 프로그램 TestGraph2 클래스에 가중치 처리부분을 추가하면 다음과 같다.

//인접 리스트를 통한 가중치 그래프 생성과 출력

#include <iostream.h>

const int max=3;

class Gnode //그래프 노드

{ public:

int nr; //노드의 번호

int weight; //가중치

Gnode *next; //인접노드에 대한 에지

}

class Graph //그래프 연산

{ public void build(Gnode *node[]) //그래프 생성

{ ............

if (n!=0)

{ temp->nr=j;

temp->weight=n;

.............

}

//그래프의 에지를 (a, w, b)의 형태로 출력

public void display(Gnode *node[])

{ .............

Page 8: 이산치수학 Project5

while (pt->next!=NULL)

{ pt=pt->next;

cout<<"("<<i<<", "<<pt->weight<<", "<<pt->nr<<") ";

}

}

}

//그래프 입력자료: 0 5 0 6 0 3 0 0 0

//그래프의 출력: (0, 5, 1) (1, 6, 0) (1, 3, 2)

출처 : rohhy.kangwon.ac.kr/attachment/1288774889.hwp출처 : http://www.aistudy.com/math/shortest_johnsonbaugh.htm

shortest path그래프의 두 정점 간의 경로 중에서 길이가 가장 짧은 경로.

[단일 시작점에서 최단 경로 구하기]

단일 시작점에서 최단 경로 구하기 문제는 임의의 시작점 1 개를 정하고 다른 노드들

사이의 최단 경로를 구하는 경우에 사용 된다.

그림을 보면 알듯이 임의의 노드 ‘A’를 먼저 선택 한다. 임의의 노드가 정해 졌다면

임의의 노드에 연결된 간선 중 비용이 적게 드는 간선을 선택하여 인접 노드와 연결을

하게 된다. 위의 그림에서는 노드 ‘A’에 연결된 간선(A->B)는 1, 간선(A->D)는 6

이다. 여기서 간선(A->B)를 선택 하게 된다. 이렇게 인접 노드와 연결이 되었다면

다시 임의의 노드와 인접 노드에 연결된 노드 중 간선의 가중치가 적은 간선을 선택

Page 9: 이산치수학 Project5

하여 연결하게 되는데, 위의 그림에서 보면 노드’B’는 노드 ‘A’에서 오는 간선의

가중치가 있으므로 포함하여 간선의 가중치를 계산 해야 한다. (A -> D)의 비용은 6

이고, (A->B->D)의 비용은 5 이다. 이렇듯 노드로 오기까지의 비용을 계산 해야

한다.

출처 : http://blog.naver.com/songsmir?

Redirect=Log&logNo=100117639573

kth power of N

2. 일 정

일 정 내 용

‘12. 5.

16

프로젝트 진행방향 토의 후 팀원의 임무분담을 정함.

알고리즘 구상, 소스 구현 및 프로젝트 관련 자료 수집

‘12. 5.

23

소스의 문제점 토의 후 해결책 제시

최종보고서 작성 후 검토

3. 업무분담

이 름 분 담 내 용

정진아 조장임무 및 자료조사

고충욱 알고리즘 구성 및 자료조사

김시백 보고서작성 및 자료조사

Page 10: 이산치수학 Project5

안영준 알고리즘을 바탕으로 한 소스구성

최보은 알고리즘 구성 및 자료조사

4. 소 스#include <stdio.h>

int main()

{

int node;//처음 입력받는 노드수

char n[400][2];//입력받을 노드

char no[20];//받는 노드의 종류

int nod[20][2];//각 노드가 입력받은 횟수

int x,y,z;//for 문용

int v;//중복확인용

int a=0;//노드 입력횟수용

int b=0;//입력횟수 확인용

char w;//잡 문자 처리용

scanf("%d",&node);

scanf("%c",&w);

for(z=0;z<20;z++){

no[z]='0';

}

for(x=0;x<400;x++){

b++;

for(y=0;y<2;y++){

v=0;

scanf("%c",&n[x][y]);

for(z=0;z<node;z++){

if(no[z]==n[x][y]){

v++;

}

}

Page 11: 이산치수학 Project5

if(v==0){

no[a]=n[x][y];

nod[a][0]=0;

nod[a][1]=0;

a++;

}

}

scanf("%c",&w);

if(w=='\n'){

break;

}

}

for(x=0;x<b;x++){

for(y=0;y<2;y++){

for(z=0;z<node;z++){

if(no[z]==n[x][y]){

nod[z][y]++;

}

}

}

}

printf("\n");

for(z=0;z<node;z++){

printf("%c %2d %2d ",no[z],nod[z][1],nod[z][0]);

if(nod[z][1]==0){

printf("source");

}

if(nod[z][0]==0){printf("sink");

}

printf("\n");

}

scanf("%d",&x);

}

출력결과

Page 12: 이산치수학 Project5

5. 회의록<1 차>

회의일시 2012 년 05 월 16 일 조 D3 작성자 11 정진아

참석자 08 고충욱 09 김시백 11 안영준 11 최보은

회의안건

1. 업무분담

2. 알고리즘 회의

3. 일정 계획

회의내용 내 용 비 고

Page 13: 이산치수학 Project5

1. 업무분담

: 조장 : 정진아

자료조사 : 고충욱, 최보은

소스코딩 : 안영준

보고서 작성 : 김시백

2. 알고리즘 회의

- 입력 형식 토의

- 어떻게 결과를 나오게 할지 토의

3. 일정 계획

: 다음시간까지 자료조사 해 오기

<2 차>

회의일시 2012 년 05 월 23 일 조 D3 작성자 11 정진아

참석자 08 고충욱 09 김시백 11 안영준 11 최보은

Page 14: 이산치수학 Project5

회의안건

1. 알고리즘 회의

2. 자료회의

3. 최종보고서 작성

회의내용

내 용 비 고

1. 알고리즘 회의

: 문자들을 입력받고 \n 을 입력받을 때 까지 저장

문자들을 받을 때 처음 받은 문자는 따로 저장

AB 가 나왔다면 A 가 앞에 나오면 A 가 지정된 2 차배열 변수

앞쪽에 +1, 뒤에 나오면 변수 뒤쪽에 +1 을 한다

출력할 때, 한 부분이라도 0 이 있으면 sink 나 source 를

출력

2. 자료회의

: 여러 용어들에 대해 숙지

3. 최종보고서 작성

: 용어들에 대해 정의 및 간단한 예시 들기

이를 토대로 보고서 작성