자료구조 05 최종 보고서

10
C3조 과제물 발표 조장 : 09송하윤 조원 : 07이용재 08이상현 09김시백 09박구남

Upload: pkok15

Post on 12-Jun-2015

237 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 자료구조 05 최종 보고서

C3조 과제물 발표

조장 : 09송하윤조원 : 07이용재

08이상현09김시백09박구남

Page 2: 자료구조 05 최종 보고서

과제수행일지

소 속 C3 조조원소개

조장 송하윤자료조사 이상현, 박구남

프로그래밍 이용재, 김시백주 제

연구제목 최단거리찾기

연구배경노드의 패스와 가중치를 이용하여 각 노드사이의 최단거리를 찾을수 있다.

참 고 자 료 과제의 수행

첫째날 2012 년 5 월 29 일 화요일회의 주제 조원 자기소개 및 역할분담, 과제 파악

회의 내용

역할분담조장 : 송하윤자료조사 : 이상현, 박구남프로그래밍 : 이용재, 김시백

과제파악1. 노드가 n(V1, V2, ... Vn)개인 그래프 G가 있다. V1에서 Vn까지의 패스를 P=(p1, p2, ..., pm) 이라고 할 경우, P에서 3개의 최단거리를 찾아라.2. 다음과 같은 프로그램을 작성한다.1. 다음과 같은 포맷을 가진 파일에서 정보를 읽어들인다.1. 첫번째 라인은 그래프 노드의 수 n이 있다.2. 두번째 라인부터 끝까지 다음과 같이 3 수를 가지고 있다.3. Vi, Vj, Wij: 여기서 Vi는 간선의 시작 노드, Vj는 간선의 끝 노드 그리고 그 간선의 가중치를 Wij이다.2. V1에서 Vn까지의 가장 짧은 패스 3개를 찾아라3. 3개의 패스를 화면에 표시하고 가중치의 합을 표시한다.

반성문제를 파악하는데 있어서 조원들간의 의견 조율이 힘들었다. 문제에 대한 이해가 조원들이 모두 달라서 과제파악에 어려움이 있었다.

둘째날 2012 년 5 월 31 일 목요일회의주제 알고리즘구현 및 파악, 자료조사

회의내용1. 개요그래프란 연결되어 있는 객체간의 관계를 표현할 수 있는 자료구조.

Page 3: 자료구조 05 최종 보고서

- 2 -

2. 설명1. 그래프 용어정점(Vertex) 이란 노드(Node)라고도 하며 객체를 나타내며, 데이터가 저장된 곳.간선(Edge) 이란 정점을 연결하는 것.

차수(Degree) 이란 하나의 정점에 닿아있는 간선의 수.1번 정점의 차수는 3 이 됩니다.

인접(Adjacent) 이란 한정점에서 간선을 한번만 통해 갈수 있다면 해당 정점간은 인접하다라고 합니다.1번 정점과 2번정점은 인접하지만, 1번 정점과 4번 정점은 인접하지 않습니다.

무향 그래프(Undirected Graph)말 그대로 방향성이 없는 간선으로 이루어진 그래프

유향 그래프(Directed graph)간선에 방향성을 나타내어 정점간의 방향관계를 타나내는 그래프

2번 정점은 3번과 1번으로 갈수 있지만, 1번 정점은 3번 정점과 4번 정점으로만 갈 수 있습니다.

Page 4: 자료구조 05 최종 보고서

- 3 -

완전 그래프(Complete Graph)모든 정점이 인접한 상태인 그래프.모든 정점이 서로 간선으로 연결된 그래프이며, n개 정점이 있다면 모든 정점이 n-1개의 간선을 갖는 그래프.

2. 그래프 표현

1. 행렬위의 유향 그래프를 행렬로 나타낸다면

이렇게 나타낼수 있습니다.세로축이 출발정점이고 가로축이 도착정점이라고 한다면,첫번째 1번 정점을 출발정점으로 각각의 정점들, 1번부터 4번 정점의 방향성을 나타낸 것이 1번 행이됩니다.

1번 정점은 1번정점으로 가는 길이 없으므로 0,1번 정점은 2번정점으로 가는 길이 없으므로 0,1번 정점은 3번정점으로 가는 길이 있으므로 1,

Page 5: 자료구조 05 최종 보고서

- 4 -

1번 정점은 4번정점으로 가는 길이 없으므로 1

이렇게 됩니다.

여기에 간선에 거리나 비용의 데이터를 넣어줘서 나타낼 수도 있습니다.

1번 정점은 3번정점으로 가는데 비용이 3이 들고,1번 정점은 4번정점으로 가는데 비용이 7이 들고,2번 정점은 1번정점으로 가는데 비용이 4가 들고,2번 정점은 3번정점으로 가는데 비용이 3이 듭니다.2. 리스트위의 그래프를 링크드(Linked List) 로 표현하면 아래와 같습니다.

1번 정점은 3번, 4번 정점으로 갈수 있고2번 정점은 1번, 3번 정점으로 갈수 있습니다.해당 링크노드에 거리나 비용을 저장하여 나타낼수도 있습니다.

알고리즘.다익스트라 알고리즘(Dijkstra's algorithm)다익스트라알고리즘은 그래프에서 최단거리를 구해, 그래프를 트리의 구조로 변경시키는데 목적이 있습니다. 여기서 경로의 길이를 감안한다는 것과 사이클이 없는 방향성 그래프에 한해서만 사용할 수 있다는 점이 있습니다.

플로이드 알고리즘(Floydalgorithm)플로이드알고리즘도 다익스트라 알고리즘처럼 최단거리를 구하는 알고리즘입니다. 다른 점은 다익스트라 알고리즘이 한 점에서 출발해서 각 정점에 최단거리를 구하지만, 플로이드 알고리즘은 모든 점점에서 출발해서 출발 한 정점을 제외한 모든 정점을 도착점으로 하는 최단거리를 구하는 알고리즘입니다

셋째날 2012 년 6 월 4 일 월요일

Page 6: 자료구조 05 최종 보고서

- 5 -

회의주제 소스구현

최종 소스

#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>

struct Node {

char name; Node *link[5]; int wei[5];//가중치 }; struct AN { char arr[10];//완성된경로I int wei; int er;//에러여부확인 }; struct Root {//결과값링크 AN *link[10]; }Node AddGraph (Node *A, Node *B) {//A와 B의AC 링크A를 건다 *A반환 for (int i = 0; i < 5 ; i++) { if (A->link[i] == 0) { A -> link[i] = B; break } else {} } return *A; } // 노드 A에 노드 B을A링크A합니다. Node AddNode (char A) {//노드초기화 초기화된 노드 반환. Node *B = (Node *)malloc(sizeof(Node)); B->name = A; for (int i = 0; i < 5 ; i++) { B->link[i] = 0; }

return *B; } // 노드 생성 함수 int search (Node *A, char B) { for (int i=0;i<5;i++) { if (A->link[i]->name == B) return i;

Page 7: 자료구조 05 최종 보고서

- 6 -

}return -1;} // 위치 찾기 void Loop (Node *A, char B, AN *C, Root *D, int spot, int wei, char arr[]) { int i,j; int asdsf = 0; arr[spot] = A->name; // 배열에 문자 저장 if (A->name == B) {// 종료 조건. C -> er = 1;//에러없이 완성됫을때 표시 for (i=0;i<10;i++) { if (D->link[i] == 0) { AN *F = (AN *)malloc(sizeof(AN)); //임시 AN형 생성 for(int q = 0 ; q<10 ; q++) {//문자열가중치를 임시 an형에 입력 F->arr[q] = arr[q]; } F->wei = wei; F -> er = C -> er; D -> link[i] = F;//root에 링크걸기 break } } return//완료됏으므로 다음링크는 무의미 하므로 이전으로 리턴 } char temp; for (j=0;j<spot;j++) {//중복여부 확인. 현재 노드가 문자열에 있는지 여부 확인 temp = arr[j]; if (arr[spot] == temp) { arr[spot] = 0;//중복되었으므로 문자 삭제 return } } spot++; for (i=0;i<5;i++) { if (A->link[i] != 0) { Loop(A->link[i],B,C,D,spot,wei + A->wei[i],arr); } else {arr[spot] = 0;} } return }

AN MST (Node *A, char B) {//root와 a의 결과값 입력에 필요한 an을초기화한다 int i,j; char arr[10]; Root D; AN C; for (i = 0 ; i < 10 ; i++) {

Page 8: 자료구조 05 최종 보고서

- 7 -

C.arr[i] = 0; D.link[i] = 0; arr[i] = 0; } C.er = 0; C.wei = 0; Loop(A,B,&C,&D,0,0,arr);//경로찾기함수 root D에 링크가 걸린다. j=0; for (i=1;i<10;i++) { if (D.link[i] != 0) {//포인터가 null이 아님은 검사 if (D.link[i]->er == 1 && D.link[j]->wei > D.link[i]->wei) { //오류가 없는 경로이고,가중치가 낮은 경로를 찾는다. j= i; } } } if (D.link[j] != 0) { } return *D.link[j];// 찾은 최단경로를 리턴 }

int main () { char a,b,c[2],arr[2],y,asd[100]; FILE *point; int i, j, NodeSize,L; Node *ans = (Node *)malloc(sizeof(Node)); point=fopen("C://file.txt","r");//파일열기if(point==NULL)//파일여부 확인{return 1;} i = 0; a=fgetc(point);//글자가져오기 NodeSize = a - 48;//첫행은 노드의 사이즈 a=fgetc(point);//개행제거 j = 0; int x = 0; y=0; int z = 0; L=0; for (;;) { //문자를 배열에 입력 a=fgetc(point);//글자가져오기 asd[L]=a; L++; if(a==EOF) break

Page 9: 자료구조 05 최종 보고서

- 8 -

} fclose(point);//파일닫기 asd[L]='*' L=0; a=0;for (;;) { if (asd[L] == '\n') {//개행일 경우 두 노드를 그래프로 만든다(링크) b-=48; for (i=0;i<j;i++) { if (ans[i].name == c[0]) x=i; } for (i=0;i<j;i++) { if (ans[i].name == c[1]) y=i; } ans[x] = AddGraph(&ans[x],&ans[y]); z = search(&ans[x],ans[y].name); ans[x].wei[z] = b; ans[y] = AddGraph(&ans[y],&ans[x]); z = search(&ans[y],ans[x].name); ans[y].wei[z] = b; a = 0; } if (asd[L] == ' ') {//' '는 구분자 이경우 노드 생성 for (i=0;i<j;i++) {//중복여부확인 if (ans[i].name == b) { x = 1; break } } if (x != 1) { ans[j] = AddNode(b);//중복이 아닐경우 노드 생성 j++; } else { x = 0; } c[a] = b; a++; } if (asd[L] == '*') break b = asd[L];

L++;}AN *out = (AN *)malloc(sizeof(AN)); //결과값 저장 구조체 for (i=1 ; i<NodeSize ; i++) { out[i-1] = MST(&ans[0],ans[i].name);//각각 문자에 대한 최단거리 구함 } for (i=0 ; i<NodeSize ; i++) { //가중치가 가장 낮은 순서로 정렬

Page 10: 자료구조 05 최종 보고서

- 9 -

for (j=i;j<NodeSize;j++){ if (out[i].wei>out[j].wei) { out[NodeSize] = out[i]; out[i] = out[j]; out[j] = out[NodeSize]; } } } for (i=0;i<3;i++) { // 가중치가 가장 낮은 3개를 출력함 for (j=0;j<10;j++) { if (out[i].arr[j] != 0) printf("%c ",out[i].arr[j]); } printf ("%d\n", out[i].wei); }getch(); return 0; }

알고리즘 개요

1. 노드의 개수와 각 노드 사이에 가중치를 정해준다.2. 모든노드에서 갈수 있는 모든 경로를 파악하고 가중치의 합을 각각 저장한다.3. 노드들의 가중치를 비교하고 가중치가 가장 작은 3개의 노드를 찾는다.4. 찾은 노드를 주어진 조건에 맞게 출력한다.