SlideShare a Scribd company logo
project #4




    Syntax of language




                  이산치수학 B1
                         조장
                20113318 정예린
                         조원
                20113311 장동규
                20093483 백종근
                20093496 윤은영
                20093468 김현호
순서
      •조원별 업무분담
         •일정 계획
         •문제 파악
       •알고리즘 계획
          •소스구현
•문제점 파악 / 해결법 토의
1)조원 별 업무분담


    정예린       알고리즘에 대한 소스 구현 및 보고서 작성



    윤은영       과제에 대한 자료조사



    김현호       역할분담 관리 및 자료수정과 편집



    장동규       보고서 편집 및 최종수정



    백종근       과제에 대한 자료조사




2)일정계획
                   과제에 대한 자료조사 및 역할분담
  4월 30일 - 5월 2일
                   참고자료를 분석하여 과제에 대한 적용방법 탐구
                   자료에 대한 과제 적용 탐구를 통해 알고리즘 작성
  5월 5일 - 5월 7일
                   알고리즘 작성 및 문제점 보완을 위한 토의
                   알고리즘을 토대로 소스 구현 및 문제점 토의
  5월 7일 - 5월 9일
                   문제점에 대한 최종 보완 및 최종 보고서 작성
3)문제파악




3)-1과제에 대한 참고자료


1. Eulerian path 오일러 경로 or 한붓그리기
-그래프의 모든 변을 단 한번씩만 통과하는 경로를 뜻함
-어떤 도형의 모든 선을 정확하게 한 번씩만 지나가는 경로


✱한붓그리기 가능 조건
홀수점(한 점에서 홀수개의 선이 뻗어나오는 점)이 없거나 2개이어야 한다.
홀수점이 2개일땐 홀수점에서 시작해야 한붓그리기가 가능하다.


예제) 다음 그림은 어느 도시의 육지와 섬을 잇는 다리를 간략하게 나타낸 것이다. 한 지점에서
출발하여 모든 다리를 한번식 모두 건너는 방법이 없었는데 다리를 하나 더 놓아서 이 문제를
해결했다고 한다. 이때 다리를 놓을 수 있는 방법의 수를 구하여라.
2. Hamiltonian circuit 해밀턴 순회
그래프에서 각 꼭지점들을 단 한번씩만 통과하는 순회를 말한다.




                          굵은 선으로 표시 된 것은 해밀
                          턴 순회를 나타낸다.
예제) 해밀턴 순회의 응용문제로는 순회판매원 문제가 있다. 순회판매원 문제란 방문하여야 할
도시들과 이들 사이의 거리가 주어졌을 경우 순회판매원이 여러 개의 도시를 방문하는데 어떤
특정한 도시를 출발하여, 어떠한 도시도 두 번 방문함이 없이 모든 도시들을 거쳐 처음 출발한
도시로 되돌아오는데, 총 여행 거리가 최소가 되는 경로를 찾는 문제.


3. Tree 트리
개념 : 나무가 하나의 뿌리에서 줄기가 나와 가지로 나누어지
는 것처럼, 어떤 하나의 집합으로부터 하위 레벨로 가지가 나
오는 집합 관계를 갖는 계층 구조를 말한다.
-비선형 자료구조
-Node( vertex )와 Link( edge )로 구성됨
-Node는 정보( data )를 포함하고 있음
다음의 특징을 만족해야 함
. Root가 하나 존재 : Root는 최상위 Node
. Root를 제외한 모든 Node는 하나의 부모를 가져야 함
. Node는 여러개의 자식을 가질 수 있음
. 한 Node로 부터 다른 Node로 가는 경로는 유일해야 함
전형적인 예 ) Windows의 디렉토리 구조


4. spanning tree 신장 트리
-연결 그래프의 부분 그래프로서 그 그래프의 모든 정점과 간선의 부분 집합으로 구성되는
트리. 모든 노드는 적어도 하나의 간선에 연결되어 있어야 한다.
-연결된, 비방향성 그래프 G에서 순환 경로를 제거하면서 연결된 부분 그래프가 되도록 이
음선을 제거하면 스패닝 트리가 된다. 따라서 스패닝 트리는 G 안에 있는 모든 정점을 다           포
함하면서 트리가 되는 연결된 부분 그래프
-특징 : 루프가 생기는 것을 방지하기 위한 프로토콜 / 스위치의 이중화시 사용한다.




5. minimum spanning tree 최소 스패닝 트리
-임의의 그래프 G에 대한 부분그래프 중에서 G의 모든 정점을 연결하는 트리 즉. 그래프의 모
든 정점을 포함한 연결된 최소의 부분 그래프
-여러 개의 가능한 신장트리중 가중치의 총합계가 가장 적은 트리를 최소 신장트리라고 함
① 정점의 수가 n일 때 (n-1)개의 간선을 가짐
② 연결되어 있음
③ cycle이 없음


6. binary tree 이진 트리
정의
모든 노드가 최대 2개의 자식을 가질 수 있는 트리. 이진이라는 이름도 자식이 둘이라는

뜻으로 붙여진 것이다. 모든 노드의 차수가 2 이하인 트리. 즉, 공집합이거나 1개의 부모

노드에서 왼쪽 서브트리와 오른쪽 서브트리로 구성된 유한 집합 구조를 말한다.
-모든 노드가 최대 2개의 지식을 가질 수 있는 트리
-모든 노드의 차수가 2 이하인 트리. 즉, 공집합이거나 1개의 부모 노드에서 왼쪽 서브트리
와 오른쪽 서브트리로 구성된 유한 집합 구조를 말한다.
방향 간선(directed edge)은 부모에서 자식으로 가는 경로를 가리킨다. (그림의 화살표 부분)

루트 노드(root node)는 부모가 없는 노드이다. 트리는 하나의 루트 노드만을 가진다.
단말 노드(leaf node)는 자식이 없는 노드이다.

각 노드의 깊이(depth)는 루트 노드에서 자신까지 가는 경로의 길이이다. 트리의 특정 깊이를
가지는 노드의 집합을 레벨(level)이라 부르기도 한다. 루트 노드의 깊이는 0이다.
트리의 높이(height)는 루트 노드에서 가장 깊이 있는 노드
까지 가는 경로의 길이이다. 루트 노드만 있는 트리의 높이
는 0이다.

형제(sibiling)은 같은 부모를 가지는 노드이다.

p에서 q까지 가는 경로가 존재할 때, p가 q보다 루트에
가까운 노드라면 p를 q의 조상(ancestor)이라 하고 q를 p의
자손(descendent)이라 한다.
노드의 크기(size)는 자신을 포함한 모든 자손 노드의 개수
이다.

노드의 진입차수(In-degree)는 노드에 들어오는 모든 간선의 수이다.

노드의 진출차수(Out-degree)는 노드에서 나가는 모든 간선의 수이다.

이진트리의 종류
1) 포화 이진 트리 : 잎 노드들이 모두 같은 깊이에 존재한다는 것이 특징
2) 완전 이진 트리 : 포화 이진 트리와는 비슷하지만, 잎 노드들이 트리의 왼쪽부터 차곡차
곡 채워진 것이 특징이다.
3) 이진 트리의 순회 : 트리 내의 노드들 사이를 돌아다니는 것을 말한다.
4)무한 완전 이진 트리(infinite complete binary tree)는 레벨이 인 이진 트리에서, 각각의 레벨
d에 존재하는 모든 노드의 수가 인 트리이다. 모든 노드 집합의 기수는 이다. 모든 경로 집합
의 기수는 이다.

5)균형 이진 트리(balanced binary tree)는 모든 단말 노드의 깊이 차이가 많아야 1인 트리이다.
균형 이진 트리는 예측 가능한 깊이(predictable depth)를 가진다. 균형 트리의 노드의 개수를
n이라고 하면 깊이는 과 같다.

6)변질 트리(degenerate tree)는 각각의 부모 노드가 하나의 자식만을 갖는 트리이다. 이는 성
능 측정에서, 트리가 연결 리스트와 같이 움직인다는 것을 의미한다.
순회는 몇 가지 규칙에 근거해서 이진 트리 내부를 돌아다니며 효율적인 방법으로 원하는 데이
터에 접근할 수 있는 방법을 제공한다.
이진 트리 탐색
이진 트리의 모든 노드를 방문하는 것 혹은 방문하여 어떤 작업을 하는 것을 이진 트리 탐색이
라고 한다. 이진 트리 탐색의 방법에는 여러 가지가 있으며, 다음의 방법들이 유명하다.

1.in-order : 왼쪽 자식노드, 내 노드, 오른쪽 자식노드 순서로 방문한다.
2.pre-order : 내 노드, 왼쪽 자식노드, 오른쪽 자식노드 순서로 방문한다.

3.post-order : 왼쪽 자식노드, 오른쪽 자식노드, 내 노드 순서로 방문한다.

4.level-order : 내 노드, 내 노드로부터 깊이 1인 노드들, 내 노드로부터 깊이 2인 노드들, ... ,
내 노드로부터 깊이 N인 노드들 (N: 나(트리)의 깊이)
3)-2자료 관련 참고단어

adjacent (인접) 두 개의 꼭지점들이 이웃하고 있다는 것은 그것들이 변으로 연결되어있다는 것
을 의미한다. 두 개의 변들이 이웃하고 있다는 것은 그것들이 한 끝점을 공유하고 있다는 것을
의미한다.
arc (유향변) 방향이 있는 변을 말한다.
articulation point (절단점)
bipartite (이분)   어떤 그래프가 bipartite라는 것은 그것의 각
변이 한 끝점은 U에 다른 끝점은 V에 갖도록 그것의 꼭지점들
의 집합이 원소를 공유하지 않는 두 개의 집합 U와 V로 이분될
수 있다는 것을 의미한다. bipartite graph를 이분그래프라 부르
고 (U, V)를 그것의 bipartition(이분 분할)이라 부른다. 이분 그
래프가 complete bipartite graph (완전 이분 그래프)라는 것은 그것의 이분 분할이 (U,V)일 때,
U의 각 꼭지점들이 V의 모든 꼭지점들과 이웃하고 있음을 의미한다. U가 m개의 원소를 V가 n
개의 원소를 가지고 있는 완전 이분 그래프를 Km,n으로 표시한다. K3,3는 옆의 그림과 같다.
chromatic number (착색수)     그래프의 착색수란 그것의 꼭지점들을 서로 인접
(adjacent)하는 것들은 다른 색을 갖도록 칠할 때 필요한 색의 수 중 최소값을 의미
한다. 예를 들어 옆의 그래프의 착색수는 3이다.
 지도에 대하여서도 이 착색수의 개념이 도입될 수 있는데, 지도를 그릴 때 국경을
접하고 있는 나라는 다른 색을 칠하도록 하는chromatic number (착색수) 데 필요한 최소색깔
수를 의미한다.
circuit (회로) 회로란 닫힌 path (경로)이다. (따라서 loop (고리) 란 길이가 1인 회로이다).
closed (닫혀진)
closed walk (닫혀진 워크) 닫혀진 워크란 시작점과 종착점이 같은 워크(walk)를 말한다. 닫혀진
트레일(closed trail)이란 시작점과 종착점이 같은 트레일(trail)을 말한다. [참조: walk 및 trail].

complete graph (완전그래프)     어떤 두 꼭지점도 이웃하는 단순 그래프(simple graph)를 완전
그래프라 하며, n개의 꼭지점을 가지는 완전 그래프는 Kn으로 나타낸다. 꼭지점의 수가 1, 2, 3,




4, 5개인 완전 그래프들은 다음과 같다:

component (성분)
connected (연결된)     어떤 그래프가 연결되어 있다는 것은 어
떤 두 개의 꼭지점도 그것들을 양끝점으로 하는 경로(path)가
존재함을 의미한다. 연결되어 있지 않은 그래프는 두 개 이상
의 연결된 성분(component) 또는 서로 공통 부분이 없는 두
개 이상의 연결된 부분그래프(subgraph)로 나뉘어 있다. 예를
들어 옆의 그래프는 3개의 연결된 성분들로 이루어져 있다.
cut vertex (절단점) 어떤 그래프의 절단점이란 그것이 그 그래프로부터 제거되었을 때 (꼭지점
이 그래프에서 제거된다는 것은 꼭지점과 그것에 입사하는(incident) 변들을 지운다는 것을 의
미) 생기는 그래프의 성분(component)의 수가 원래보다 적어도 하나 더 늘어나게 되는 꼭지점
을 말한다. [참조: connected (연결된)].
cycle (회로) 회로는 시작점과 종착점 외에는 어떤 꼭지점도 반복되지 않는 닫혀진 트레일
(closed trail)을 의미한다.
degree (차수)    그래프에서 꼭지점의 차수란 그 꼭지점을 끝점으로 가지는 변의
수를 의미한다. 이 때 고리(loop)는 두 번 세어 준다. valence라고도 한다. 예를
들어, 이 그래프에서는 모든 꼭지점들이 차수를 3으로 갖는다. 유향그래프
(digraph) 에서는 차수의 개념이 내차수(in-degree)와 외차수(out-degree) 로 나뉘
어 진다. (각 꼭지점의 내차수와 외차수를 모두 더하면 그 유향그래프의 방향을 무시하여 생기
는 그래프의 각 꼭지점의 차수와 같다.)
digraph (유향그래프)        유향그래프란 그것의 각 변이 방향을 갖고 있는 그래프를
의미한다. 좀 더 정확히 정의하면 유향그래프란 V라는 유한 집합과 원소들이 V의
원소들로 이루어진 순서쌍들인 집합 A로 이루어진 순서쌍 (V,A)를 의미한다. V의
원소들을 꼭지점(vertex)이라 부르고 A의 원소들을 유향변(arc)이라고 부른다. 유향
변 (a,b)이 주어졌을 때 a를 그 유향변의 시작점(initial vertex), b를 종착점(terminal vertex)이라
고 부른다.
directed graph (유향그래프)
edge (변)
Four Color Theorem (4색 문제) 모든 planar (평면) graph 의 chromatics number (착색수) 가
4이하라고 주장하는 문제이다.
graph 쉽게 이야기하면 변(edge)이라고 불리는 것들에 의하여 연결된 꼭지점들의 유한 집합이
다. 좀 더 정확히 정의하면, 단순 그래프(simple graph)란 V라는 꼭지점의 집합과 V의 서로 다
른 두 원소로 이루어진 집합들의 집합 E로 이루어진 순서쌍 (V,E)를 의미한다.
 모든 그래프가 다 단순 그래프는 아니다. 때때로 두 개의 꼭지점들이 여러 개의 변들(multiple
edges)로 연결될 수도 있고, 한 꼭지점이 자기 자신과 고리(loop)라는 변에 의하여 연결될 수도
있다. 경우에 따라서 그래프를 multigraph (멀티그래프)로 단순 그래프를 그래프(graph)로 부를
때도 있다. 그래프의 각 변에 방향을 줄 수 있는데 이렇게 하여 생긴 그래프를 유향그래프
(digraph 또는 directed graph)라고 부른다.
in-degree (내차수) 어떤 꼭지점 v의 내차수란 v를 종착점으로 가지는 유향변(arc)의 개수를 말
한다.
initial vertex (시작점)
isolated (분리된) 차수 (degree)가 0인 꼭지점, 즉 변의 끝도 아닌 꼭지점을 분리되었다고 한다.


Kuratowski's Theorem (정리) 그래프가 평면그래프가 아니라는 것과 그것이 K3,3 또는 K5와 동
상인(homeomorphic) 부분그래프를 포함하는 것은 서로 동치이다.
length (길이)
loop (고리) 고리란 양끝점이 같은 변을 의미한다. [참조: degree(차수)에 대한 설명중 고리를 3
개 가진 그래프에 대한 예를 보시오].
multigraph (멀티그래프) 쉽게 이야기하면 멀티그래프는 두 개의 꼭지점사이에 여러개의 변이
있는 그래프를 의미한다. 좀더 정확하게 정의하면, 멀티그래프는 V라고 하는 꼭지점들의 집합
과 변들의 집합인 E, 그리고 E로부터 V에 있는 꼭지점들의 순서쌍의 집합({{u,v}|u,v in V; uv })
으로의 함수 f로 이루어져 있다. 여기에서 함수 f는 변의 양끝점을 제시한다. 만약, 두 개의 변
r과 s의 함수값이 같다면, 즉 f(r)=f(s)이면, 우리는 r과 s는 평행하다라고 하거나 multiple edges
라고 한다. [참조: graph와 pseudograph]
multiple edge (다중변)
node (노드) vertex (꼭지점)과 깉은 말이다.
out-degree (외차수) 어떤 꼭지점v의 외차수란 시작점을 v로 하는 유향변(arc)의 개수를 말한다.
pendant (펜던트) degree (차수)가 1인 꼭지점을 펜던트 꼭지점이라 한다.
planar (평면) 어떤 그래프를 평면 위에 꼭지점에서만 교차하도록 그릴 수 있으면 평면 그래프
(planar graph)라 한다. 예를 들면, K4는 평면 그래프이다.
pseudograph (가그래프) 쉽게 이야기하면 가그래프는 다중변이나 고리를 가지고 있는 그래프
이다. 정확하게 정의하면 가 그래프는 꼭지점들의 집합인 V와 변들의 집합인 E, 그리고 E에서
집합 { {u,v} | u,v in V } 으로의 함수 f로 이루어져 있다. 여기에서 함수 f는 변의 양끝점을 제
시한다.
terminal vertex (도착점)
trail(트레일) 변이 중복되지 않는 워크(walk)를 말한다. [참고: walk]
undirected edge 보통의 graph를 말한다.
valence (차수)
vertex (꼭지점)
walk (워크) 꼭지점과 변이 교대로 나타나는 열이면서, 각 변의 앞과 뒤에 위치한 꼭지점을 그
변의 양끝점으로 갖는 열을 말한다.
VERTEX 두 개 이상의 반직선, 포물선, 곡선이 만나서 이루                            는
정점이다. 삼각형은 세 개의 꼭짓점을 갖고 있다.
평면 위의 1점 O를 끝점으로 하는 2개의 반직선 OA, OB                             를
그 평면 위에 그었을 때, ∠AOB의 점 O를 각의 꼭짓점이라                             한
다. 또, 2개의 반직선 OA, OB를 각의 변이라 한다.




                                           각도의 정점은 2개의 선이 세그
                                           먼트 또는 라인이 함께 종점.




EDGE -다면체를 이루고 있는 평면다각형을 다면체의 면(面), 두 면에 공통인 다각형의 변을
다면체의 모서리라고 한다.
-다면체에서 각 면의 경계를 이루고 있는 선분들
-같은 개념으로 2차원 도형의 변



Multigrape -임의의 정점 쌍에 대하여 여러 개의 간선이 존재하는 그래프
-단순 그래프의 확장으로서 한 쌍의 꼭지점 사이에 연결선의 개수의 제한이 없는 그래프
노드 ‘가’와 ‘바’를 연결하는 간선의 수는3이고, 노드 ‘마’와 ‘라’를 연결하는 간선의 수는2이다.
즉, 위의 그래프와 같이 간선을 여러 개 포함하는 것이다.


Simple graph 단순 그래프-다음 조건을 만족하는 순서쌍 G=(V,E)이다. 단, V는 공집합이 아닌
꼭지점의 집합, E는 V의   두 원소를 부분집합으로 가지는 부분집합들의 집합이다.
-한 쌍의 정점 사이에 많아도 하나의 연결선으로 이루어진, 우리가 통상 다루는 그래프로서

자기 자신으로의 연결선이 없는 그래프이다




                           단순 그래프의 예
Cycle 첫 번째 정점과 마지막 정점이 같은 단순 경로




                                 그래프의 예
                 G1에서   ABDA :    단순 경로이고 사이클이다.
                 ABDCBA : 단순 경로는 아니지만 사이클임




4)알고리즘 계획
4)-1 Kruscal 방법
알고리즘


간선중 비용이 적은 순으로 소트
가장 적은 비용이 드는 간선부터 차례대로 추가
추가중 사이클이 존재하는 간선은 제외
모든 정점이 연결될 때 까지 2 - 3 과정을 반복


위에서 든 예로 모든 정점을 포함 해야 하므로 그림과 같이 준비 한다. 목표는 이 정점들이 사
이클을 발생하지 않으면서 모두 연결되어야 한다.
cost 가 작은 간선 부터 하나씩 연결 한다.




2 , 3 번 정점의 간선 5 를 선택




2 , 4 번 정점의 간선 6 을 선택




3 , 4 번 정점의 간선 10 을 선택하면 사이클이 발생하므로 10 을 버림
•
2 , 6 번 정점의 11 을 선택
...
이 과정을 모든 정점이 연결할 때 까지 반복
구현... union and find 를 이용... 시간 복잡도: O(e loge)


4)-2 Prim 방법
kruskal 방법과 달리 정점을 하나씩 추가. 정정의 수가 n 개이면 n-1 번의 반복이 필요.
알고리즘 임의의 정점을 선택
이 정점에서 다른 정점으로 갈수 있는 최소 비용의 정점을 선택
이 정점은 제외
이 정점에서 다른 정점으로 가는 비용과 기존의 비용과 비교후 더 작은 비용이 있으면 갱신
step4. 2-3 번 과정을 n(정점의수)-1 번 반복


prim방법으로 구하는 예제




                            최소비용 신장트리


                         ------------------>



1. 임의의 정점(1,2,3,4 중 하나)에서 시작             3 번 정점에서 시작한다고 하면
정   방문유   아 버 지   패스크
                    점   무     정점      기
                    1   x     3       8
                    2   x     3       9
                    3   o     x       0
                    4   x     3       2




s2. 방문되지 않는 노드 중 패스가 최소인 정점을 선택 이 간선은 최소비용 스패닝트리의 간선
이 됨.(그리디)
        이 정점에 연결된 방문되지 않은 정점 중 패스의 크기가 작은 것이 있으면 갱신
        이 경우 2 번 정점으로 가는 기존의 패스가 9 이고 , 4 에서 2 로 가는 정점이 6 이므
로 갱신.




정   방문유     아 버 지   패스크         정   방문유   아 버 지   패스크
점   무       정점      기           점   무     정점      기
1   x       3       8           1   x     3       8
2   x       3       9           2   x     4       6
3   o       x       0           3   o     x       0
4   o       3       2           4   o     3       2

3. 이 과정을 노드수가 4 개이므로 3 번 반복.
5)소스구현

5)-1 PRIM을 기반으로 한 알고리즘 계획


                          방문유무를 체크하는     노드의   연결정보(어   노드와 그 노드와 연
     노드의 개수만큼 행
                          것(방문 시-1, 초기   떤 노드와 연결되어     결되어 있는 노드의
     정의
                          값-0)           있는지를 표시)       크기 표시
     A
     B
     C
     ...


➀한 개의 임의의 정점을 선택한다. 예를 들면 A노드를 선택한다.
➁A노드를 방문 하였으므로, 방문유무를 체크하는 부분은 1로 바뀌며 A는 최초의 정
점이므로 노드의 연결정보는 비어있다.
➂A를 기분으로 각 노드와 A노드의 정보를 저장한다. A와 연결되어 있는 노드들은 노
드의 연결정보에 A를 넣고 크기를 표시한다.
➃가장 작은 크기를 가지는 노드 두 개를 선택하여 그 노드를 방문 표시를 1로 바꿔
준 후 방문 된 노드들과 방문하지 않은 노드들 간에서 가장 단거리를 선택하여 다시
값을 갱신시켜 준다.
➄방문유무를 체크하는 곳이 모두 1이 되면, 노드의 연결정보와 노드를 같이 출력해주
면 각 노드들의 최소신장트리 연결선이 완성된다.


#include<stdio.h>
#include<stdlib.h>
#define TRUE1
#define FALSE0
#define VERTICES 7
#define INF 1000L
struct node
{
           char name[100];
           int l[100];
};
int main()
{
           struct node in[100];
           int   m;
           int i=0,j=0;
struct node temp;
char **prime;
scanf("%d",&m);


do
{
       scanf("%s %d",&in[i].name,&in[i].l);
       i++;
}while(i<6); /
prime=(char**)malloc(sizeof(char*)*m);


for(i=0;i<m;i++)
{
       prime[i]=(char*)malloc(sizeof(char)*4);
}


for(i=0;i<m;i++)
{
       prime[i][0]='A'+i;
}


for(i=0;i<m;i++)
{
       prime[i][1]='0'
}


for(i=0;i<m;i++)
{
       for(j=0;j<4;j++)
       {
                 printf("%c ",prime[i][j]);
       }
       printf("n");
}
}
문제점 : 트리의 사용과 적용과정이 명확하지 않고, 소스의 완성도가 낮아진다.


5)-2 prim 참고
#include <stdio.h>
#defineTRUE1
#defineFALSE0
#define VERTICES 7
#define INF 1000L


int adj_mat[VERTICES][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[VERTICES];
int dist[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);
}


//
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("%dn", u);


          for( v=0; v<n; v++)
          {
               if( adj_mat[u][v]!= INF)
               {
                    if( !selected[v] && adj_mat[u][v]< dist[v] )
                          dist[v] = adj_mat[u][v]; // 간선의 거리를 확정
               }
          }
     }
}
//
void main()
{
     prim(0, VERTICES);
}

More Related Content

DOCX
이산치수학 Project4
PDF
Mst 구하기
PDF
자료구조 04 최종 보고서
PDF
2012 Ds 04
PDF
자료구조 트리 보고서
PDF
2012 Ds 06
PDF
2012 Ds 05
PDF
2012 Dm 01
이산치수학 Project4
Mst 구하기
자료구조 04 최종 보고서
2012 Ds 04
자료구조 트리 보고서
2012 Ds 06
2012 Ds 05
2012 Dm 01

Similar to 2012 Dm 04 (20)

PDF
Project#4 Syntax Of Languages Hwp
PDF
길찾기
PPT
Data Structure 2
PPTX
이산수학 Ch.5
PPTX
자료구조 그래프
PPTX
그래프 알고리즘
PPTX
02.선형변환과 행렬
PDF
Aho-Corasick Algorithm(아호 코라식 알고리즘)
PPTX
유니티 고급 과정 -2-
PPTX
코딩 테스트 합격자 되기 C++ 11장 그래프에 대한 강의 자료 입니다.
PPTX
택시 기하에서의 이차곡선.pwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwptx
PDF
서울대학교 2017 SNUPC 문제
PDF
[Swift] Data Structure - Graph
PDF
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
DOCX
이산치수학 Project5
PPTX
선형연립방정식 가우스소거법
PDF
DP 알고리즘에 대해 알아보자.pdf
PDF
자료구조4보고서
PPTX
유향트리
PDF
Project#4상호참조 생성기 Hwp
Project#4 Syntax Of Languages Hwp
길찾기
Data Structure 2
이산수학 Ch.5
자료구조 그래프
그래프 알고리즘
02.선형변환과 행렬
Aho-Corasick Algorithm(아호 코라식 알고리즘)
유니티 고급 과정 -2-
코딩 테스트 합격자 되기 C++ 11장 그래프에 대한 강의 자료 입니다.
택시 기하에서의 이차곡선.pwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwptx
서울대학교 2017 SNUPC 문제
[Swift] Data Structure - Graph
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
이산치수학 Project5
선형연립방정식 가우스소거법
DP 알고리즘에 대해 알아보자.pdf
자료구조4보고서
유향트리
Project#4상호참조 생성기 Hwp
Ad

2012 Dm 04

  • 1. project #4 Syntax of language 이산치수학 B1 조장 20113318 정예린 조원 20113311 장동규 20093483 백종근 20093496 윤은영 20093468 김현호
  • 2. 순서 •조원별 업무분담 •일정 계획 •문제 파악 •알고리즘 계획 •소스구현 •문제점 파악 / 해결법 토의
  • 3. 1)조원 별 업무분담 정예린 알고리즘에 대한 소스 구현 및 보고서 작성 윤은영 과제에 대한 자료조사 김현호 역할분담 관리 및 자료수정과 편집 장동규 보고서 편집 및 최종수정 백종근 과제에 대한 자료조사 2)일정계획 과제에 대한 자료조사 및 역할분담 4월 30일 - 5월 2일 참고자료를 분석하여 과제에 대한 적용방법 탐구 자료에 대한 과제 적용 탐구를 통해 알고리즘 작성 5월 5일 - 5월 7일 알고리즘 작성 및 문제점 보완을 위한 토의 알고리즘을 토대로 소스 구현 및 문제점 토의 5월 7일 - 5월 9일 문제점에 대한 최종 보완 및 최종 보고서 작성
  • 4. 3)문제파악 3)-1과제에 대한 참고자료 1. Eulerian path 오일러 경로 or 한붓그리기 -그래프의 모든 변을 단 한번씩만 통과하는 경로를 뜻함 -어떤 도형의 모든 선을 정확하게 한 번씩만 지나가는 경로 ✱한붓그리기 가능 조건 홀수점(한 점에서 홀수개의 선이 뻗어나오는 점)이 없거나 2개이어야 한다. 홀수점이 2개일땐 홀수점에서 시작해야 한붓그리기가 가능하다. 예제) 다음 그림은 어느 도시의 육지와 섬을 잇는 다리를 간략하게 나타낸 것이다. 한 지점에서 출발하여 모든 다리를 한번식 모두 건너는 방법이 없었는데 다리를 하나 더 놓아서 이 문제를 해결했다고 한다. 이때 다리를 놓을 수 있는 방법의 수를 구하여라.
  • 5. 2. Hamiltonian circuit 해밀턴 순회 그래프에서 각 꼭지점들을 단 한번씩만 통과하는 순회를 말한다. 굵은 선으로 표시 된 것은 해밀 턴 순회를 나타낸다. 예제) 해밀턴 순회의 응용문제로는 순회판매원 문제가 있다. 순회판매원 문제란 방문하여야 할 도시들과 이들 사이의 거리가 주어졌을 경우 순회판매원이 여러 개의 도시를 방문하는데 어떤 특정한 도시를 출발하여, 어떠한 도시도 두 번 방문함이 없이 모든 도시들을 거쳐 처음 출발한 도시로 되돌아오는데, 총 여행 거리가 최소가 되는 경로를 찾는 문제. 3. Tree 트리 개념 : 나무가 하나의 뿌리에서 줄기가 나와 가지로 나누어지 는 것처럼, 어떤 하나의 집합으로부터 하위 레벨로 가지가 나 오는 집합 관계를 갖는 계층 구조를 말한다. -비선형 자료구조 -Node( vertex )와 Link( edge )로 구성됨 -Node는 정보( data )를 포함하고 있음 다음의 특징을 만족해야 함 . Root가 하나 존재 : Root는 최상위 Node . Root를 제외한 모든 Node는 하나의 부모를 가져야 함 . Node는 여러개의 자식을 가질 수 있음
  • 6. . 한 Node로 부터 다른 Node로 가는 경로는 유일해야 함 전형적인 예 ) Windows의 디렉토리 구조 4. spanning tree 신장 트리 -연결 그래프의 부분 그래프로서 그 그래프의 모든 정점과 간선의 부분 집합으로 구성되는 트리. 모든 노드는 적어도 하나의 간선에 연결되어 있어야 한다. -연결된, 비방향성 그래프 G에서 순환 경로를 제거하면서 연결된 부분 그래프가 되도록 이 음선을 제거하면 스패닝 트리가 된다. 따라서 스패닝 트리는 G 안에 있는 모든 정점을 다 포 함하면서 트리가 되는 연결된 부분 그래프 -특징 : 루프가 생기는 것을 방지하기 위한 프로토콜 / 스위치의 이중화시 사용한다. 5. minimum spanning tree 최소 스패닝 트리 -임의의 그래프 G에 대한 부분그래프 중에서 G의 모든 정점을 연결하는 트리 즉. 그래프의 모 든 정점을 포함한 연결된 최소의 부분 그래프 -여러 개의 가능한 신장트리중 가중치의 총합계가 가장 적은 트리를 최소 신장트리라고 함 ① 정점의 수가 n일 때 (n-1)개의 간선을 가짐 ② 연결되어 있음 ③ cycle이 없음 6. binary tree 이진 트리 정의 모든 노드가 최대 2개의 자식을 가질 수 있는 트리. 이진이라는 이름도 자식이 둘이라는 뜻으로 붙여진 것이다. 모든 노드의 차수가 2 이하인 트리. 즉, 공집합이거나 1개의 부모 노드에서 왼쪽 서브트리와 오른쪽 서브트리로 구성된 유한 집합 구조를 말한다. -모든 노드가 최대 2개의 지식을 가질 수 있는 트리 -모든 노드의 차수가 2 이하인 트리. 즉, 공집합이거나 1개의 부모 노드에서 왼쪽 서브트리 와 오른쪽 서브트리로 구성된 유한 집합 구조를 말한다. 방향 간선(directed edge)은 부모에서 자식으로 가는 경로를 가리킨다. (그림의 화살표 부분) 루트 노드(root node)는 부모가 없는 노드이다. 트리는 하나의 루트 노드만을 가진다. 단말 노드(leaf node)는 자식이 없는 노드이다. 각 노드의 깊이(depth)는 루트 노드에서 자신까지 가는 경로의 길이이다. 트리의 특정 깊이를 가지는 노드의 집합을 레벨(level)이라 부르기도 한다. 루트 노드의 깊이는 0이다.
  • 7. 트리의 높이(height)는 루트 노드에서 가장 깊이 있는 노드 까지 가는 경로의 길이이다. 루트 노드만 있는 트리의 높이 는 0이다. 형제(sibiling)은 같은 부모를 가지는 노드이다. p에서 q까지 가는 경로가 존재할 때, p가 q보다 루트에 가까운 노드라면 p를 q의 조상(ancestor)이라 하고 q를 p의 자손(descendent)이라 한다. 노드의 크기(size)는 자신을 포함한 모든 자손 노드의 개수 이다. 노드의 진입차수(In-degree)는 노드에 들어오는 모든 간선의 수이다. 노드의 진출차수(Out-degree)는 노드에서 나가는 모든 간선의 수이다. 이진트리의 종류 1) 포화 이진 트리 : 잎 노드들이 모두 같은 깊이에 존재한다는 것이 특징 2) 완전 이진 트리 : 포화 이진 트리와는 비슷하지만, 잎 노드들이 트리의 왼쪽부터 차곡차 곡 채워진 것이 특징이다. 3) 이진 트리의 순회 : 트리 내의 노드들 사이를 돌아다니는 것을 말한다. 4)무한 완전 이진 트리(infinite complete binary tree)는 레벨이 인 이진 트리에서, 각각의 레벨 d에 존재하는 모든 노드의 수가 인 트리이다. 모든 노드 집합의 기수는 이다. 모든 경로 집합 의 기수는 이다. 5)균형 이진 트리(balanced binary tree)는 모든 단말 노드의 깊이 차이가 많아야 1인 트리이다. 균형 이진 트리는 예측 가능한 깊이(predictable depth)를 가진다. 균형 트리의 노드의 개수를 n이라고 하면 깊이는 과 같다. 6)변질 트리(degenerate tree)는 각각의 부모 노드가 하나의 자식만을 갖는 트리이다. 이는 성 능 측정에서, 트리가 연결 리스트와 같이 움직인다는 것을 의미한다. 순회는 몇 가지 규칙에 근거해서 이진 트리 내부를 돌아다니며 효율적인 방법으로 원하는 데이 터에 접근할 수 있는 방법을 제공한다. 이진 트리 탐색 이진 트리의 모든 노드를 방문하는 것 혹은 방문하여 어떤 작업을 하는 것을 이진 트리 탐색이 라고 한다. 이진 트리 탐색의 방법에는 여러 가지가 있으며, 다음의 방법들이 유명하다. 1.in-order : 왼쪽 자식노드, 내 노드, 오른쪽 자식노드 순서로 방문한다. 2.pre-order : 내 노드, 왼쪽 자식노드, 오른쪽 자식노드 순서로 방문한다. 3.post-order : 왼쪽 자식노드, 오른쪽 자식노드, 내 노드 순서로 방문한다. 4.level-order : 내 노드, 내 노드로부터 깊이 1인 노드들, 내 노드로부터 깊이 2인 노드들, ... , 내 노드로부터 깊이 N인 노드들 (N: 나(트리)의 깊이)
  • 8. 3)-2자료 관련 참고단어 adjacent (인접) 두 개의 꼭지점들이 이웃하고 있다는 것은 그것들이 변으로 연결되어있다는 것 을 의미한다. 두 개의 변들이 이웃하고 있다는 것은 그것들이 한 끝점을 공유하고 있다는 것을 의미한다. arc (유향변) 방향이 있는 변을 말한다. articulation point (절단점) bipartite (이분) 어떤 그래프가 bipartite라는 것은 그것의 각 변이 한 끝점은 U에 다른 끝점은 V에 갖도록 그것의 꼭지점들 의 집합이 원소를 공유하지 않는 두 개의 집합 U와 V로 이분될 수 있다는 것을 의미한다. bipartite graph를 이분그래프라 부르 고 (U, V)를 그것의 bipartition(이분 분할)이라 부른다. 이분 그 래프가 complete bipartite graph (완전 이분 그래프)라는 것은 그것의 이분 분할이 (U,V)일 때, U의 각 꼭지점들이 V의 모든 꼭지점들과 이웃하고 있음을 의미한다. U가 m개의 원소를 V가 n 개의 원소를 가지고 있는 완전 이분 그래프를 Km,n으로 표시한다. K3,3는 옆의 그림과 같다. chromatic number (착색수) 그래프의 착색수란 그것의 꼭지점들을 서로 인접 (adjacent)하는 것들은 다른 색을 갖도록 칠할 때 필요한 색의 수 중 최소값을 의미 한다. 예를 들어 옆의 그래프의 착색수는 3이다. 지도에 대하여서도 이 착색수의 개념이 도입될 수 있는데, 지도를 그릴 때 국경을 접하고 있는 나라는 다른 색을 칠하도록 하는chromatic number (착색수) 데 필요한 최소색깔 수를 의미한다. circuit (회로) 회로란 닫힌 path (경로)이다. (따라서 loop (고리) 란 길이가 1인 회로이다). closed (닫혀진) closed walk (닫혀진 워크) 닫혀진 워크란 시작점과 종착점이 같은 워크(walk)를 말한다. 닫혀진 트레일(closed trail)이란 시작점과 종착점이 같은 트레일(trail)을 말한다. [참조: walk 및 trail]. complete graph (완전그래프) 어떤 두 꼭지점도 이웃하는 단순 그래프(simple graph)를 완전 그래프라 하며, n개의 꼭지점을 가지는 완전 그래프는 Kn으로 나타낸다. 꼭지점의 수가 1, 2, 3, 4, 5개인 완전 그래프들은 다음과 같다: component (성분) connected (연결된) 어떤 그래프가 연결되어 있다는 것은 어 떤 두 개의 꼭지점도 그것들을 양끝점으로 하는 경로(path)가 존재함을 의미한다. 연결되어 있지 않은 그래프는 두 개 이상 의 연결된 성분(component) 또는 서로 공통 부분이 없는 두 개 이상의 연결된 부분그래프(subgraph)로 나뉘어 있다. 예를 들어 옆의 그래프는 3개의 연결된 성분들로 이루어져 있다. cut vertex (절단점) 어떤 그래프의 절단점이란 그것이 그 그래프로부터 제거되었을 때 (꼭지점 이 그래프에서 제거된다는 것은 꼭지점과 그것에 입사하는(incident) 변들을 지운다는 것을 의
  • 9. 미) 생기는 그래프의 성분(component)의 수가 원래보다 적어도 하나 더 늘어나게 되는 꼭지점 을 말한다. [참조: connected (연결된)]. cycle (회로) 회로는 시작점과 종착점 외에는 어떤 꼭지점도 반복되지 않는 닫혀진 트레일 (closed trail)을 의미한다. degree (차수) 그래프에서 꼭지점의 차수란 그 꼭지점을 끝점으로 가지는 변의 수를 의미한다. 이 때 고리(loop)는 두 번 세어 준다. valence라고도 한다. 예를 들어, 이 그래프에서는 모든 꼭지점들이 차수를 3으로 갖는다. 유향그래프 (digraph) 에서는 차수의 개념이 내차수(in-degree)와 외차수(out-degree) 로 나뉘 어 진다. (각 꼭지점의 내차수와 외차수를 모두 더하면 그 유향그래프의 방향을 무시하여 생기 는 그래프의 각 꼭지점의 차수와 같다.) digraph (유향그래프) 유향그래프란 그것의 각 변이 방향을 갖고 있는 그래프를 의미한다. 좀 더 정확히 정의하면 유향그래프란 V라는 유한 집합과 원소들이 V의 원소들로 이루어진 순서쌍들인 집합 A로 이루어진 순서쌍 (V,A)를 의미한다. V의 원소들을 꼭지점(vertex)이라 부르고 A의 원소들을 유향변(arc)이라고 부른다. 유향 변 (a,b)이 주어졌을 때 a를 그 유향변의 시작점(initial vertex), b를 종착점(terminal vertex)이라 고 부른다. directed graph (유향그래프) edge (변) Four Color Theorem (4색 문제) 모든 planar (평면) graph 의 chromatics number (착색수) 가 4이하라고 주장하는 문제이다. graph 쉽게 이야기하면 변(edge)이라고 불리는 것들에 의하여 연결된 꼭지점들의 유한 집합이 다. 좀 더 정확히 정의하면, 단순 그래프(simple graph)란 V라는 꼭지점의 집합과 V의 서로 다 른 두 원소로 이루어진 집합들의 집합 E로 이루어진 순서쌍 (V,E)를 의미한다. 모든 그래프가 다 단순 그래프는 아니다. 때때로 두 개의 꼭지점들이 여러 개의 변들(multiple edges)로 연결될 수도 있고, 한 꼭지점이 자기 자신과 고리(loop)라는 변에 의하여 연결될 수도 있다. 경우에 따라서 그래프를 multigraph (멀티그래프)로 단순 그래프를 그래프(graph)로 부를 때도 있다. 그래프의 각 변에 방향을 줄 수 있는데 이렇게 하여 생긴 그래프를 유향그래프 (digraph 또는 directed graph)라고 부른다. in-degree (내차수) 어떤 꼭지점 v의 내차수란 v를 종착점으로 가지는 유향변(arc)의 개수를 말 한다. initial vertex (시작점) isolated (분리된) 차수 (degree)가 0인 꼭지점, 즉 변의 끝도 아닌 꼭지점을 분리되었다고 한다. Kuratowski's Theorem (정리) 그래프가 평면그래프가 아니라는 것과 그것이 K3,3 또는 K5와 동 상인(homeomorphic) 부분그래프를 포함하는 것은 서로 동치이다. length (길이) loop (고리) 고리란 양끝점이 같은 변을 의미한다. [참조: degree(차수)에 대한 설명중 고리를 3 개 가진 그래프에 대한 예를 보시오]. multigraph (멀티그래프) 쉽게 이야기하면 멀티그래프는 두 개의 꼭지점사이에 여러개의 변이 있는 그래프를 의미한다. 좀더 정확하게 정의하면, 멀티그래프는 V라고 하는 꼭지점들의 집합 과 변들의 집합인 E, 그리고 E로부터 V에 있는 꼭지점들의 순서쌍의 집합({{u,v}|u,v in V; uv })
  • 10. 으로의 함수 f로 이루어져 있다. 여기에서 함수 f는 변의 양끝점을 제시한다. 만약, 두 개의 변 r과 s의 함수값이 같다면, 즉 f(r)=f(s)이면, 우리는 r과 s는 평행하다라고 하거나 multiple edges 라고 한다. [참조: graph와 pseudograph] multiple edge (다중변) node (노드) vertex (꼭지점)과 깉은 말이다. out-degree (외차수) 어떤 꼭지점v의 외차수란 시작점을 v로 하는 유향변(arc)의 개수를 말한다. pendant (펜던트) degree (차수)가 1인 꼭지점을 펜던트 꼭지점이라 한다. planar (평면) 어떤 그래프를 평면 위에 꼭지점에서만 교차하도록 그릴 수 있으면 평면 그래프 (planar graph)라 한다. 예를 들면, K4는 평면 그래프이다. pseudograph (가그래프) 쉽게 이야기하면 가그래프는 다중변이나 고리를 가지고 있는 그래프 이다. 정확하게 정의하면 가 그래프는 꼭지점들의 집합인 V와 변들의 집합인 E, 그리고 E에서 집합 { {u,v} | u,v in V } 으로의 함수 f로 이루어져 있다. 여기에서 함수 f는 변의 양끝점을 제 시한다. terminal vertex (도착점) trail(트레일) 변이 중복되지 않는 워크(walk)를 말한다. [참고: walk] undirected edge 보통의 graph를 말한다. valence (차수) vertex (꼭지점) walk (워크) 꼭지점과 변이 교대로 나타나는 열이면서, 각 변의 앞과 뒤에 위치한 꼭지점을 그 변의 양끝점으로 갖는 열을 말한다. VERTEX 두 개 이상의 반직선, 포물선, 곡선이 만나서 이루 는 정점이다. 삼각형은 세 개의 꼭짓점을 갖고 있다. 평면 위의 1점 O를 끝점으로 하는 2개의 반직선 OA, OB 를 그 평면 위에 그었을 때, ∠AOB의 점 O를 각의 꼭짓점이라 한 다. 또, 2개의 반직선 OA, OB를 각의 변이라 한다. 각도의 정점은 2개의 선이 세그 먼트 또는 라인이 함께 종점. EDGE -다면체를 이루고 있는 평면다각형을 다면체의 면(面), 두 면에 공통인 다각형의 변을 다면체의 모서리라고 한다. -다면체에서 각 면의 경계를 이루고 있는 선분들 -같은 개념으로 2차원 도형의 변 Multigrape -임의의 정점 쌍에 대하여 여러 개의 간선이 존재하는 그래프 -단순 그래프의 확장으로서 한 쌍의 꼭지점 사이에 연결선의 개수의 제한이 없는 그래프
  • 11. 노드 ‘가’와 ‘바’를 연결하는 간선의 수는3이고, 노드 ‘마’와 ‘라’를 연결하는 간선의 수는2이다. 즉, 위의 그래프와 같이 간선을 여러 개 포함하는 것이다. Simple graph 단순 그래프-다음 조건을 만족하는 순서쌍 G=(V,E)이다. 단, V는 공집합이 아닌 꼭지점의 집합, E는 V의 두 원소를 부분집합으로 가지는 부분집합들의 집합이다. -한 쌍의 정점 사이에 많아도 하나의 연결선으로 이루어진, 우리가 통상 다루는 그래프로서 자기 자신으로의 연결선이 없는 그래프이다 단순 그래프의 예 Cycle 첫 번째 정점과 마지막 정점이 같은 단순 경로 그래프의 예 G1에서 ABDA : 단순 경로이고 사이클이다. ABDCBA : 단순 경로는 아니지만 사이클임 4)알고리즘 계획
  • 12. 4)-1 Kruscal 방법 알고리즘 간선중 비용이 적은 순으로 소트 가장 적은 비용이 드는 간선부터 차례대로 추가 추가중 사이클이 존재하는 간선은 제외 모든 정점이 연결될 때 까지 2 - 3 과정을 반복 위에서 든 예로 모든 정점을 포함 해야 하므로 그림과 같이 준비 한다. 목표는 이 정점들이 사 이클을 발생하지 않으면서 모두 연결되어야 한다. cost 가 작은 간선 부터 하나씩 연결 한다. 2 , 3 번 정점의 간선 5 를 선택 2 , 4 번 정점의 간선 6 을 선택 3 , 4 번 정점의 간선 10 을 선택하면 사이클이 발생하므로 10 을 버림
  • 13. • 2 , 6 번 정점의 11 을 선택 ... 이 과정을 모든 정점이 연결할 때 까지 반복 구현... union and find 를 이용... 시간 복잡도: O(e loge) 4)-2 Prim 방법 kruskal 방법과 달리 정점을 하나씩 추가. 정정의 수가 n 개이면 n-1 번의 반복이 필요. 알고리즘 임의의 정점을 선택 이 정점에서 다른 정점으로 갈수 있는 최소 비용의 정점을 선택 이 정점은 제외 이 정점에서 다른 정점으로 가는 비용과 기존의 비용과 비교후 더 작은 비용이 있으면 갱신 step4. 2-3 번 과정을 n(정점의수)-1 번 반복 prim방법으로 구하는 예제 최소비용 신장트리 ------------------> 1. 임의의 정점(1,2,3,4 중 하나)에서 시작 3 번 정점에서 시작한다고 하면
  • 14. 방문유 아 버 지 패스크 점 무 정점 기 1 x 3 8 2 x 3 9 3 o x 0 4 x 3 2 s2. 방문되지 않는 노드 중 패스가 최소인 정점을 선택 이 간선은 최소비용 스패닝트리의 간선 이 됨.(그리디) 이 정점에 연결된 방문되지 않은 정점 중 패스의 크기가 작은 것이 있으면 갱신 이 경우 2 번 정점으로 가는 기존의 패스가 9 이고 , 4 에서 2 로 가는 정점이 6 이므 로 갱신. 정 방문유 아 버 지 패스크 정 방문유 아 버 지 패스크 점 무 정점 기 점 무 정점 기 1 x 3 8 1 x 3 8 2 x 3 9 2 x 4 6 3 o x 0 3 o x 0 4 o 3 2 4 o 3 2 3. 이 과정을 노드수가 4 개이므로 3 번 반복.
  • 15. 5)소스구현 5)-1 PRIM을 기반으로 한 알고리즘 계획 방문유무를 체크하는 노드의 연결정보(어 노드와 그 노드와 연 노드의 개수만큼 행 것(방문 시-1, 초기 떤 노드와 연결되어 결되어 있는 노드의 정의 값-0) 있는지를 표시) 크기 표시 A B C ... ➀한 개의 임의의 정점을 선택한다. 예를 들면 A노드를 선택한다. ➁A노드를 방문 하였으므로, 방문유무를 체크하는 부분은 1로 바뀌며 A는 최초의 정 점이므로 노드의 연결정보는 비어있다. ➂A를 기분으로 각 노드와 A노드의 정보를 저장한다. A와 연결되어 있는 노드들은 노 드의 연결정보에 A를 넣고 크기를 표시한다. ➃가장 작은 크기를 가지는 노드 두 개를 선택하여 그 노드를 방문 표시를 1로 바꿔 준 후 방문 된 노드들과 방문하지 않은 노드들 간에서 가장 단거리를 선택하여 다시 값을 갱신시켜 준다. ➄방문유무를 체크하는 곳이 모두 1이 되면, 노드의 연결정보와 노드를 같이 출력해주 면 각 노드들의 최소신장트리 연결선이 완성된다. #include<stdio.h> #include<stdlib.h> #define TRUE1 #define FALSE0 #define VERTICES 7 #define INF 1000L struct node { char name[100]; int l[100]; }; int main() { struct node in[100]; int m; int i=0,j=0;
  • 16. struct node temp; char **prime; scanf("%d",&m); do { scanf("%s %d",&in[i].name,&in[i].l); i++; }while(i<6); / prime=(char**)malloc(sizeof(char*)*m); for(i=0;i<m;i++) { prime[i]=(char*)malloc(sizeof(char)*4); } for(i=0;i<m;i++) { prime[i][0]='A'+i; } for(i=0;i<m;i++) { prime[i][1]='0' } for(i=0;i<m;i++) { for(j=0;j<4;j++) { printf("%c ",prime[i][j]); } printf("n"); }
  • 17. } 문제점 : 트리의 사용과 적용과정이 명확하지 않고, 소스의 완성도가 낮아진다. 5)-2 prim 참고 #include <stdio.h> #defineTRUE1 #defineFALSE0 #define VERTICES 7 #define INF 1000L int adj_mat[VERTICES][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[VERTICES]; int dist[VERTICES]; // 최소 dist[v] 값을 갖는 정점을 반환 int get_min_vertex(int n) { int v,i; for (i = 0; i <n; i++) { if (!selected[i]) { v = i; break; } } // 선택하지 않은 간선들 중 최소 가중치값을 갖는 정점을 찾는다.
  • 18. for (i = 0; i < n; i++) { if( !selected[i] && (dist[i] < dist[v])) v = i; } return (v); } // 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("%dn", u); for( v=0; v<n; v++) { if( adj_mat[u][v]!= INF) { if( !selected[v] && adj_mat[u][v]< dist[v] ) dist[v] = adj_mat[u][v]; // 간선의 거리를 확정 } } } }
  • 19. // void main() { prim(0, VERTICES); }