SlideShare une entreprise Scribd logo
1  sur  10
Télécharger pour lire hors ligne
C3조 과제물 발표



       조장 : 09송하윤
       조원 : 07이용재
           08이상현
           09김시백
           09박구남
과제수행일지
                                                   조원소개
소 속             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. 개요
회의내용
        그래프란 연결되어 있는 객체간의 관계를 표현할 수 있는 자료구조.
2. 설명
1. 그래프 용어
정점(Vertex) 이란 노드(Node)라고도 하며 객체를 나타내며, 데이터가 저장된 곳.
간선(Edge) 이란 정점을 연결하는 것.




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


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


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




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




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




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




2. 그래프 표현


1. 행렬

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




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


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



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

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




                          - 4 -
회의주제                                                 소 스구 현
        #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;




                                                - 5 -
}
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++) {




                                          - 6 -
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




                                        - 7 -
}
    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++) { //가중치가 가장 낮은 순서로 정렬




                                      - 8 -
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 ("%dn", out[i].wei);
                            }
          getch();
           return 0;
          }



          1. 노드의 개수와 각 노드 사이에 가중치를 정해준다.
          2. 모든노드에서 갈수 있는 모든 경로를 파악하고 가중치의 합을 각각 저장한다.
          3. 노드들의 가중치를 비교하고 가중치가 가장 작은 3개의 노드를 찾는다.
알고리즘 개요

          4. 찾은 노드를 주어진 조건에 맞게 출력한다.


                                              결과 발표




  결 과




 최종 반성




                                                 - 9 -

Contenu connexe

Tendances

2012 Ds B2 05
2012 Ds B2 052012 Ds B2 05
2012 Ds B2 05chl132435
 
포인터의 기초(1)
포인터의 기초(1)포인터의 기초(1)
포인터의 기초(1)Hoyoung Jung
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터Hoyoung Jung
 
포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1Hoyoung Jung
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4KoChungWook
 
2012 Ds C2 06
2012 Ds C2 062012 Ds C2 06
2012 Ds C2 06seonhyung
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdfkd19h
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터fefe7270
 
포인터와 배열
포인터와 배열포인터와 배열
포인터와 배열Kim YoSep
 
2012 Ds A1 03
2012 Ds A1 032012 Ds A1 03
2012 Ds A1 03seonhyung
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5KoChungWook
 
[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)Bill Kim
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdfkd19h
 

Tendances (20)

2012 Ds 03
2012 Ds 032012 Ds 03
2012 Ds 03
 
2012 Ds B2 05
2012 Ds B2 052012 Ds B2 05
2012 Ds B2 05
 
2012 Ds 05
2012 Ds 052012 Ds 05
2012 Ds 05
 
포인터의 기초(1)
포인터의 기초(1)포인터의 기초(1)
포인터의 기초(1)
 
3.포인터
3.포인터3.포인터
3.포인터
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
 
포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4
 
2012 Ds C2 06
2012 Ds C2 062012 Ds C2 06
2012 Ds C2 06
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터
 
2012 Dm 07
2012 Dm 072012 Dm 07
2012 Dm 07
 
Ch05
Ch05Ch05
Ch05
 
포인터와 배열
포인터와 배열포인터와 배열
포인터와 배열
 
2012 Ds A1 03
2012 Ds A1 032012 Ds A1 03
2012 Ds A1 03
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5
 
[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)
 
강의자료 2
강의자료 2강의자료 2
강의자료 2
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf
 

En vedette

Estándares europeos de calidad para los servicios de empleo con apoyo.
Estándares europeos de calidad para los servicios de empleo con apoyo.Estándares europeos de calidad para los servicios de empleo con apoyo.
Estándares europeos de calidad para los servicios de empleo con apoyo.José María
 
Happiest Minds is Hiring!!!!!!!
Happiest Minds is Hiring!!!!!!!Happiest Minds is Hiring!!!!!!!
Happiest Minds is Hiring!!!!!!!Ashok K DL
 
Havas pr emilie parker art connection
Havas pr  emilie parker art connectionHavas pr  emilie parker art connection
Havas pr emilie parker art connectionHavas
 
(Sadn1013 h) kump 15
(Sadn1013 h) kump 15(Sadn1013 h) kump 15
(Sadn1013 h) kump 15sadn1013
 
Are you experienced (cont.)
Are you experienced (cont.) Are you experienced (cont.)
Are you experienced (cont.) Royi benyossef
 
Mind patterns and anti-patterns
Mind patterns and anti-patternsMind patterns and anti-patterns
Mind patterns and anti-patternsVladimir Dzhuvinov
 
이벤트펜션 산정호수숙박
이벤트펜션 산정호수숙박이벤트펜션 산정호수숙박
이벤트펜션 산정호수숙박jdhfrter
 
Getting started book response
Getting started book   responseGetting started book   response
Getting started book responsepatpatpati
 
GeoStories - Integration of Digital Media and Maps (GISCO Fall Meeting)
GeoStories - Integration of Digital Media and Maps (GISCO Fall Meeting)GeoStories - Integration of Digital Media and Maps (GISCO Fall Meeting)
GeoStories - Integration of Digital Media and Maps (GISCO Fall Meeting)Jeremy W. Goldsmith
 
Reverse-engineering techniques in Data Integration
Reverse-engineering techniques in Data IntegrationReverse-engineering techniques in Data Integration
Reverse-engineering techniques in Data IntegrationCOST action BM1006
 
Hiring for fit, hiring for talent
Hiring for fit, hiring for talentHiring for fit, hiring for talent
Hiring for fit, hiring for talentGenghis Philip
 
2015.05.05 AccountingDay - A Peek in the Future of Corporate America False Pr...
2015.05.05 AccountingDay - A Peek in the Future of Corporate America False Pr...2015.05.05 AccountingDay - A Peek in the Future of Corporate America False Pr...
2015.05.05 AccountingDay - A Peek in the Future of Corporate America False Pr...blairbaker008
 
Sesión hematuria dic 14
Sesión hematuria dic 14Sesión hematuria dic 14
Sesión hematuria dic 14fguiraos
 

En vedette (20)

Estándares europeos de calidad para los servicios de empleo con apoyo.
Estándares europeos de calidad para los servicios de empleo con apoyo.Estándares europeos de calidad para los servicios de empleo con apoyo.
Estándares europeos de calidad para los servicios de empleo con apoyo.
 
Happiest Minds is Hiring!!!!!!!
Happiest Minds is Hiring!!!!!!!Happiest Minds is Hiring!!!!!!!
Happiest Minds is Hiring!!!!!!!
 
Havas pr emilie parker art connection
Havas pr  emilie parker art connectionHavas pr  emilie parker art connection
Havas pr emilie parker art connection
 
Capital autospa
Capital autospaCapital autospa
Capital autospa
 
(Sadn1013 h) kump 15
(Sadn1013 h) kump 15(Sadn1013 h) kump 15
(Sadn1013 h) kump 15
 
Education
EducationEducation
Education
 
Planimetria camper
Planimetria camperPlanimetria camper
Planimetria camper
 
WAS-for-dummies
WAS-for-dummiesWAS-for-dummies
WAS-for-dummies
 
Yasmily laminario
Yasmily laminarioYasmily laminario
Yasmily laminario
 
Are you experienced (cont.)
Are you experienced (cont.) Are you experienced (cont.)
Are you experienced (cont.)
 
delitos informaticos
delitos informaticosdelitos informaticos
delitos informaticos
 
Mind patterns and anti-patterns
Mind patterns and anti-patternsMind patterns and anti-patterns
Mind patterns and anti-patterns
 
이벤트펜션 산정호수숙박
이벤트펜션 산정호수숙박이벤트펜션 산정호수숙박
이벤트펜션 산정호수숙박
 
Getting started book response
Getting started book   responseGetting started book   response
Getting started book response
 
GeoStories - Integration of Digital Media and Maps (GISCO Fall Meeting)
GeoStories - Integration of Digital Media and Maps (GISCO Fall Meeting)GeoStories - Integration of Digital Media and Maps (GISCO Fall Meeting)
GeoStories - Integration of Digital Media and Maps (GISCO Fall Meeting)
 
Reverse-engineering techniques in Data Integration
Reverse-engineering techniques in Data IntegrationReverse-engineering techniques in Data Integration
Reverse-engineering techniques in Data Integration
 
Introdução à anatomia
Introdução à anatomiaIntrodução à anatomia
Introdução à anatomia
 
Hiring for fit, hiring for talent
Hiring for fit, hiring for talentHiring for fit, hiring for talent
Hiring for fit, hiring for talent
 
2015.05.05 AccountingDay - A Peek in the Future of Corporate America False Pr...
2015.05.05 AccountingDay - A Peek in the Future of Corporate America False Pr...2015.05.05 AccountingDay - A Peek in the Future of Corporate America False Pr...
2015.05.05 AccountingDay - A Peek in the Future of Corporate America False Pr...
 
Sesión hematuria dic 14
Sesión hematuria dic 14Sesión hematuria dic 14
Sesión hematuria dic 14
 

Similaire à 자료구조 그래프 보고서

2012 Ds A1 05
2012 Ds A1 052012 Ds A1 05
2012 Ds A1 05seonhyung
 
이산치수학 Project5
이산치수학 Project5이산치수학 Project5
이산치수학 Project5KoChungWook
 
5통신망에서 길 찾기
5통신망에서 길 찾기5통신망에서 길 찾기
5통신망에서 길 찾기herojoon1378
 
Project#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpProject#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpKimjeongmoo
 
자료구조 트리 보고서
자료구조 트리 보고서자료구조 트리 보고서
자료구조 트리 보고서mil23
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfkd19h
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfjinwookhong
 
자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서KimChangHoen
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpKimjeongmoo
 
Project#3다항식의연산 Hwp
Project#3다항식의연산 HwpProject#3다항식의연산 Hwp
Project#3다항식의연산 HwpKimjeongmoo
 
자료구조3보고서
자료구조3보고서자료구조3보고서
자료구조3보고서KimChangHoen
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서KimChangHoen
 
자료구조 04 최종 보고서
자료구조 04 최종 보고서자료구조 04 최종 보고서
자료구조 04 최종 보고서pkok15
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdfjinwookhong
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7mil23
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfkd19h
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfjinwookhong
 

Similaire à 자료구조 그래프 보고서 (20)

2012 Ds A1 05
2012 Ds A1 052012 Ds A1 05
2012 Ds A1 05
 
이산치수학 Project5
이산치수학 Project5이산치수학 Project5
이산치수학 Project5
 
5통신망에서 길 찾기
5통신망에서 길 찾기5통신망에서 길 찾기
5통신망에서 길 찾기
 
Project#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpProject#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 Hwp
 
자료구조 트리 보고서
자료구조 트리 보고서자료구조 트리 보고서
자료구조 트리 보고서
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
이산치2번
이산치2번이산치2번
이산치2번
 
자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 Hwp
 
Project#3다항식의연산 Hwp
Project#3다항식의연산 HwpProject#3다항식의연산 Hwp
Project#3다항식의연산 Hwp
 
자료구조3보고서
자료구조3보고서자료구조3보고서
자료구조3보고서
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서
 
2012 Ds 04
2012 Ds 042012 Ds 04
2012 Ds 04
 
자료구조 04 최종 보고서
자료구조 04 최종 보고서자료구조 04 최종 보고서
자료구조 04 최종 보고서
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
이산수학03
이산수학03이산수학03
이산수학03
 

Plus de mil23

이산치수학 데이터베이스
이산치수학 데이터베이스이산치수학 데이터베이스
이산치수학 데이터베이스mil23
 
이산치보고서
이산치보고서이산치보고서
이산치보고서mil23
 
길찾기
길찾기길찾기
길찾기mil23
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3mil23
 
프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서mil23
 
파스칼삼각형
파스칼삼각형파스칼삼각형
파스칼삼각형mil23
 
보고서1
보고서1보고서1
보고서1mil23
 
말의여행
말의여행말의여행
말의여행mil23
 

Plus de mil23 (8)

이산치수학 데이터베이스
이산치수학 데이터베이스이산치수학 데이터베이스
이산치수학 데이터베이스
 
이산치보고서
이산치보고서이산치보고서
이산치보고서
 
길찾기
길찾기길찾기
길찾기
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3
 
프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서
 
파스칼삼각형
파스칼삼각형파스칼삼각형
파스칼삼각형
 
보고서1
보고서1보고서1
보고서1
 
말의여행
말의여행말의여행
말의여행
 

자료구조 그래프 보고서

  • 1. C3조 과제물 발표 조장 : 09송하윤 조원 : 07이용재 08이상현 09김시백 09박구남
  • 2. 과제수행일지 조원소개 소 속 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. 개요 회의내용 그래프란 연결되어 있는 객체간의 관계를 표현할 수 있는 자료구조.
  • 3. 2. 설명 1. 그래프 용어 정점(Vertex) 이란 노드(Node)라고도 하며 객체를 나타내며, 데이터가 저장된 곳. 간선(Edge) 이란 정점을 연결하는 것. 차수(Degree) 이란 하나의 정점에 닿아있는 간선의 수. 1번 정점의 차수는 3 이 됩니다. 인접(Adjacent) 이란 한정점에서 간선을 한번만 통해 갈수 있다면 해당 정점간은 인접하 다라고 합니다. 1번 정점과 2번정점은 인접하지만, 1번 정점과 4번 정점은 인접하지 않습니다. 무향 그래프(Undirected Graph) 말 그대로 방향성이 없는 간선으로 이루어진 그래프 유향 그래프(Directed graph) 간선에 방향성을 나타내어 정점간의 방향관계를 타나내는 그래프 2번 정점은 3번과 1번으로 갈수 있지만, 1번 정점은 3번 정점과 4번 정점으로만 갈 수 있습니다. - 2 -
  • 4. 완전 그래프(Complete Graph) 모든 정점이 인접한 상태인 그래프. 모든 정점이 서로 간선으로 연결된 그래프이며, n개 정점이 있다면 모든 정점이 n-1개 의 간선을 갖는 그래프. 2. 그래프 표현 1. 행렬 위의 유향 그래프를 행렬로 나타낸다면 이렇게 나타낼수 있습니다. 세로축이 출발정점이고 가로축이 도착정점이라고 한다면, 첫번째 1번 정점을 출발정점으로 각각의 정점들, 1번부터 4번 정점의 방향성을 나타낸 것이 1번 행이됩니다. 1번 정점은 1번정점으로 가는 길이 없으므로 0, 1번 정점은 2번정점으로 가는 길이 없으므로 0, 1번 정점은 3번정점으로 가는 길이 있으므로 1, - 3 -
  • 5. 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) 알고리즘(Dijkstra's 다익스트라알고리즘은 그래프에서 최단거리를 구해, 그래프를 트리의 구조로 변경시키는 데 목적이 있습니다. 여기서 경로의 길이를 감안한다는 것과 사이클이 없는 방향성 그래 프에 한해서만 사용할 수 있다는 점이 있습니다. 알고리즘(Floydalgorithm) 플로이드 알고리즘(Floydalgorithm) 플로이드알고리즘도 다익스트라 알고리즘처럼 최단거리를 구하는 알고리즘입니다. 다른 점은 다익스트라 알고리즘이 한 점에서 출발해서 각 정점에 최단거리를 구하지만, 플로 이드 알고리즘은 모든 점점에서 출발해서 출발 한 정점을 제외한 모든 정점을 도착점으 로 하는 최단거리를 구하는 알고리즘입니다 셋째날 2012 년 6 월 4 일 월요일 - 4 -
  • 6. 회의주제 소 스구 현 #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; - 5 -
  • 7. } 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++) { - 6 -
  • 8. 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 - 7 -
  • 9. } 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++) { //가중치가 가장 낮은 순서로 정렬 - 8 -
  • 10. 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 ("%dn", out[i].wei); } getch(); return 0; } 1. 노드의 개수와 각 노드 사이에 가중치를 정해준다. 2. 모든노드에서 갈수 있는 모든 경로를 파악하고 가중치의 합을 각각 저장한다. 3. 노드들의 가중치를 비교하고 가중치가 가장 작은 3개의 노드를 찾는다. 알고리즘 개요 4. 찾은 노드를 주어진 조건에 맞게 출력한다. 결과 발표 결 과 최종 반성 - 9 -