2. 조원 : 2008 고충욱
2009 김시백
2011 안영준
2011 최보은
차 례
1. 프로젝트 설명
2. 일 정
3. 업무분담
3. 4. 소 스
5. 회의록
1. 프로젝트 설명
directed graph(방향그래프)
한 쌍의 노드간에 방향성을 갖는 에지로 연결된 그래프를 소위 방향성
그래프(directed graph: Digraph)라 하는데, 이는 모든 에지에 대하여 한 쌍의
노드가 정돈되어 있는 그래프이다. 즉 v1, v2∈V ⇒ (v1, v2)≠(v2, v1)의 특성을
4. 갖는 그래프이다. 이때 (v1, v2)에서 v1 은 v2 의 꼬리(tail)라하고, v2 는 v1 의
머리(head)라 한다.
<그림-1> 그래프의 유형
출처 : rohhy.kangwon.ac.kr/attachment/1288774889.hwp
precedes / antecedent(선조)
트리(tree)의 특정한 노드에 대해 관계가 있는 노드들을 나타내는 용어. 여기서
특정 노드의 선조는 트리의 근 노드에서 해당 노드까지의 경로 상에 있는 모든
노드를 말한다.
출처 : http://terms.naver.com/entry.nhn?docId=815129
indegree
외부에서 내부로 들어오는 간선들의 수
outdegree
내부에서 외부로 들어오는 간선들의 수
source
내부에서 외부로 나가는 간선들만 존재
sink
외부에서 내부로 들어오는 간선들만 존재
5. 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 0
6. 1 1 0 1
2 0 0 0
[그림-5.7] 인접행렬
//인접행렬을 통한 그래프 생성과 출력
#include <iostream.h>
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++)
7. 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)
인접행렬로 그래프를 구현할 경우 한 노드에 접근하는데 요구되는 시간은 노드의
수에 따라 결정된다. 그러나 인접행렬로 구현된 그래프는 접근시간이 짧기
때문에 에지가 존재하는지 자주 알 필요가 있을 때 유용하다.
인접행렬에 의한 방향성 그래프는 n2 보다 적은 에지를 갖은 경우일지라도
에지를 구성하기 위해 n2 에 해당하는 메모리를 필요로 한다. 뿐만 아니라 한
노드를 탐색하는데 소요되는 시간은 노드의 수 n 에 관련 O(n2)에 달한다.
8. 한편 비방향성 그래프인 경우에는 행렬의 대각선을 중심으로 에지의 관계가
대칭을 이루기 때문에 에지가 중복해서 표기된다. 이에 따라 그래프를 구현할 때,
기억장소를 절약하려면 이미 배열에서 다루었던 삼각행렬(triangular matrix)이나,
희소행렬(sparse matrix)을 이용할 수 있다. 이때 만약 비방향성 그래프를
삼각행렬로 구현한다면 그래프의 탐색시간은 O(n*(n-1)/2)에 달하게 될 것이다.
출처 : http://webedu.ksc.re.kr/graduate_new/data/final_group18.pdf
rohhy.kangwon.ac.kr/attachment/1288774889.hwp
path(경로) / 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.hwp
reachability matrix(도달행렬)
E 에 대한 인접행렬이 A 이고 E*에 대한 인접행렬이 A*일 때 A*은 아래의 식으로
계산되며 이를
G 에 대한 도달행렬(reachability matrix)이라고 한다.
*
A
출처 : chiwoos.tistory.com/attachment/499a1f051d1269L.ppt
weighted digraph(가중치그래프)가 간선에 값을 부여한 그래프이고,
weight of a path(가중치 그래프 내의 경로의 길이)는 경로 안의 간선의 가중치의
합이라는 것이다. edge(간선) 의 가중치를 로 표기한다.
9. 탐색트리에서 경로를 정하는 노드의 키 값처럼 그래프를 순행할 때 경로선택의
기준을 제공하는 것으로 에지의 특성을 나타내는 가중치를 가질 수 있는데 보통
그래프를 구성하는 에지의 가중치는 복합적인 에지의 속성 값으로 해석된다.
인접 행렬에서 그래프 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[]) //그래프 생성
{ ............
10. if (n!=0)
{ temp->nr=j;
temp->weight=n;
.............
}
//그래프의 에지를 (a, w, b)의 형태로 출력
public void display(Gnode *node[])
{ .............
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
그래프의 두 정점 간의 경로 중에서 길이가 가장 짧은 경로.
[단일 시작점에서 최단 경로 구하기]
11. 단일 시작점에서 최단 경로 구하기 문제는 임의의 시작점 1 개를 정하고 다른
노드들 사이의 최단 경로를 구하는 경우에 사용 된다.
그림을 보면 알듯이 임의의 노드 ‘A’를 먼저 선택 한다. 임의의 노드가 정해
졌다면 임의의 노드에 연결된 간선 중 비용이 적게 드는 간선을 선택하여 인접
노드와 연결을 하게 된다. 위의 그림에서는 노드 ‘A’에 연결된 간선(A->B)는 1,
간선(A->D)는 6 이다. 여기서 간선(A->B)를 선택 하게 된다. 이렇게 인접 노드와
연결이 되었다면 다시 임의의 노드와 인접 노드에 연결된 노드 중 간선의
가중치가 적은 간선을 선택 하여 연결하게 되는데, 위의 그림에서 보면 노드’B’는
노드 ‘A’에서 오는 간선의 가중치가 있으므로 포함하여 간선의 가중치를 계산
해야 한다. (A -> D)의 비용은 6 이고, (A->B->D)의 비용은 5 이다. 이렇듯 노드로
오기까지의 비용을 계산 해야 한다.
출처 : http://blog.naver.com/songsmir?Redirect=Log&logNo=100117639573
kth power of N
2. 일 정
12. 일 정 내 용
프로젝트 진행방향 토의 후 팀원의 임무분담을 정함.
‘12. 5. 16
알고리즘 구상, 소스 구현 및 프로젝트 관련 자료 수집
소스의 문제점 토의 후 해결책 제시
‘12. 5. 23
최종보고서 작성 후 검토
3. 업무분담
이 름 분 담 내 용
정진아 조장임무 및 자료조사
고충욱 알고리즘 구성 및 자료조사
김시백 보고서작성 및 자료조사
안영준 알고리즘을 바탕으로 한 소스구성
최보은 알고리즘 구성 및 자료조사
4. 소 스
#include <stdio.h>
13. 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++;
16. 5. 회의록
<1 차>
회의일시 2012 년 05 월 16 일 조 D3 작성자 11 정진아
참석자 08 고충욱 09 김시백 11 안영준 11 최보은
1. 업무분담
회의안건 2. 알고리즘 회의
3. 일정 계획
회의내용 내 용 비 고
17. 1. 업무분담
: 조장 : 정진아
자료조사 : 고충욱, 최보은
소스코딩 : 안영준
보고서 작성 : 김시백
2. 알고리즘 회의
- 입력 형식 토의
- 어떻게 결과를 나오게 할지 토의
3. 일정 계획
: 다음시간까지 자료조사 해 오기
<2 차>
회의일시 2012 년 05 월 23 일 조 D3 작성자 11 정진아
참석자 08 고충욱 09 김시백 11 안영준 11 최보은
18. 1. 알고리즘 회의
회의안건 2. 자료회의
3. 최종보고서 작성
내 용 비 고
1. 알고리즘 회의
: 문자들을 입력받고 n 을 입력받을 때 까지 저장
문자들을 받을 때 처음 받은 문자는 따로 저장
AB 가 나왔다면 A 가 앞에 나오면 A 가 지정된 2 차배열
변수 앞쪽에 +1, 뒤에 나오면 변수 뒤쪽에 +1 을 한다
회의내용 출력할 때, 한 부분이라도 0 이 있으면 sink 나 source 를
출력
2. 자료회의
: 여러 용어들에 대해 숙지
3. 최종보고서 작성
: 용어들에 대해 정의 및 간단한 예시 들기
이를 토대로 보고서 작성