SlideShare une entreprise Scribd logo
1  sur  13
Télécharger pour lire hors ligne
project #4



통신망에서 길 찾기


             이산치수학 C1조



             20083458 민영지
             20093474 박구남
             20093526 정준용
             20093530 최고봉
순서




      •조원별 업무분담


         •일정 계획


         •문제 파악


       •알고리즘 계획


          •소스구현


•문제점 파악 / 해결법 토의


          •최종소스
1)조원별 업무 분담
              최종 보고서 작성 및 프로젝트 총괄
민영지
              및 자료 조사


박구남           알고리즘 구상 및 소스 구현



정준용           알고리즘 구상 및 소스 구현



최고봉           알고리즘 구상 및 소스 구현




2)일정계획
              과제에 대한 자료 조사 및 업무분담
05.14~05.16
              일정 계획

              프로젝트 알고리즘 구성 및 소스 구
05.16~05.21
              현


05.21~05.23   최종 소스 확인 및 최종보고서 작성
3)문제파악


Degree 출력


-adjacent matrix가 주어졌을 때 indegree/outdegree를 출력하고

source/sink를 구별하시오.




-입력


 4
 AB, BD, CB, DC




-출력


 A 0 1 source
 B 2 1
 C 1 1
 D 1 1
4)알고리즘 계획


 노드의 개수를 입력 받은 후 그 개수만큼의 빈 Node를 만든
다. 입력받은 Edge의 값과 비교하여 indegree와 outdegree의
값을 증가시킨다. 출력하는 부분에서 indegree의 값이 0이면
Source, outdegree의 값이 0이면 Sink를 출력하고 끝낸다.



5)소스 구현


1차 소스
 #include <stdio.h>
 #include <stdlib.h>

 typedef struct Node {
      char name;
      struct Node *next;
      struct Node *prev;
 }Node;

 typedef struct rst {
       int indgree;
       int outdgree;
 }rst;

 Node **graph;

 void InitGraph(int n);
 Node *AppendNode(Node *Target, Node *aNode);
 int DeleteNode(Node *Target);
 void UnInitGraph(int n);
void main() {
     int n, i, j, x;
     char name[3];
     Node *Now, temp;
     rst *result;
     temp.name = 0;   temp.next = NULL; temp.prev = NULL;

    printf("노드의 개수를 입력해주세요.n");
    scanf("%d",&n);
    result = (rst *)malloc(n*sizeof(rst));
    for( i = 0 ; i < n ; i++ ) {
            result[i].indgree = 0;
            result[i].outdgree = 0;
    }
    InitGraph(n);
    printf("Edge를 입력해주세요.(예, AB, BD)n입력을 끝내시려면 0을
            입력하세요.n");
    while(1) {
            scanf("%s",name);
            if( name[0] == '0' ) break;

           for( x = 0 ; x < n ; x++ ) {
                  Now = graph[x];
                  if( graph[x]->name == name[0] ) {
                          temp.name = name[1];
                          AppendNode(Now,&temp);
                          result[x].outdgree++;
                          break;
                  }
                  else if( graph[x]->next == NULL ) {
                          graph[x]->name = name[0];
                          temp.name = name[1];
                          AppendNode(Now,&temp);
                          result[x].outdgree++;
                          break;
                  }
           }
    }
    for( i = 0, j = 0 ; ; j++ ) {
if( j >= n ) {
                    j = -1;
                    i++;
                    if( i >= n ) break;
                    continue;
            }
            Now = graph[j]->next;
            while(1) {
                    if( Now == NULL )
                             break;
                    if( graph[i]->name == Now->name )
                            result[i].indgree++;
                    Now = Now->next;
            }
     }
     for( i = 0 ; i < n ; i++ ) {
             printf("%c %d %d ", graph[i]->name, result[i].indgree,
                     result[i].outdgree);
             if( result[i].indgree == 0 )
                     printf("Source");
             else if( result[i].outdgree == 0 )
                     printf("Sink");
             printf("n");
     }
     free(result);
     UnInitGraph(n);
     printf("n계속하시려면 아무키나 누르세요....");
     getch();
     system("PAUSE");
}

void InitGraph(int n) {
     int i;
     graph = (Node **)malloc(n*sizeof(Node *));
     for( i = 0 ; i < n ; i++ ) {
             graph[i] = (Node *)malloc(sizeof(Node));
             graph[i]->next = NULL;
             graph[i]->prev = NULL;
     }
}

Node *AppendNode(Node *Target, Node *aNode) {
    Node *New;
    Node *Right;
    Node *tail;
    New = (Node *)malloc(sizeof(Node));
    for(tail=Target;tail->next;tail=tail->next);
    *New = *aNode;
    Right = tail->next;
    New->next = Right;
    New->prev = tail;
    tail->next = New;
    if (Right) {
            Right->prev = New;
    }
    return New;
}

int DeleteNode(Node *Target) {
     Node *Left, *Right;
     if( Target == NULL )
             return 0;
     Left = Target->prev;
     Right = Target->next;
     Left->next = Right;
     if (Right)
             Right->prev = Left;
     free(Target);
     return 1;
}

void UnInitGraph(int n) {
     int i;
     for( i = 0 ; i < n ; i++ )
             while(DeleteNode(graph[i]->next));
     free(graph);
     graph = NULL;
}
1차 소스 문제점
- 입력하여 출력할 때 Sink가 되면 제대로 출력되지 않았다.
     for( i = 0 ; i < n ; i++ ) {
             printf("%c %d %d ", graph[i]->name, result[i].indgree,
                     result[i].outdgree);
             if( result[i].indgree == 0 )
                     printf("Source");
             else if( result[i].outdgree == 0 )
                     printf("Sink");
             printf("n");
     }


최종소스
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
     char name;
     struct Node *next;
     struct Node *prev;
}Node;

typedef struct rst {
      int indgree;
      int outdgree;
}rst;

Node **graph;

void InitGraph(int n);
Node *AppendNode(Node *Target, Node *aNode);
int DeleteNode(Node *Target);
void UnInitGraph(int n);

void main() {
     int n, i, j, x;
     char name[3];
Node *Now, temp;
   rst *result;
   temp.name = 0;   temp.next = NULL; temp.prev = NULL;

   printf("노드의 개수를 입력해주세요.n");
   scanf("%d",&n);
   result = (rst *)malloc(n*sizeof(rst));
   for( i = 0 ; i < n ; i++ ) {
           result[i].indgree = 0;
           result[i].outdgree = 0;
   }
   InitGraph(n);
   printf("Edge를 입력해주세요.(예, AB, BD)n입력을 끝내시려면 0 을
입력하세요.n");
   while(1) {
           scanf("%s",name);
           if( name[0] == '0' ) break;

        for( x = 0 ; x < n ; x++ ) {
               Now = graph[x];
               if( graph[x]->name == name[0] ) {
                       temp.name = name[1];
                       AppendNode(Now,&temp);
                       result[x].outdgree++;
                       break;
               }
               else if( graph[x]->next == NULL ) {
                       graph[x]->name = name[0];
                       temp.name = name[1];
                       AppendNode(Now,&temp);
                       result[x].outdgree++;
                       break;
               }
        }
        for( x = 0 ; x < n ; x++ ) {
               Now = graph[x];
               if( graph[x]->name == name[1] ) {
                       break;
               }
else if( graph[x]->next == NULL ) {
                          graph[x]->name = name[1];
                          temp.name = '0';
                          AppendNode(Now,&temp);
                          break;
                  }
           }
     }
     for( i = 0, j = 0 ; ; j++ ) {
             if( j >= n ) {
                     j = -1;
                     i++;
                     if( i >= n ) break;
                     continue;
             }
             Now = graph[j]->next;
             while(1) {
                     if( Now == NULL )
                              break;
                     if( graph[i]->name == Now->name )
                             result[i].indgree++;
                     Now = Now->next;
             }
     }
     for( i = 0 ; i < n ; i++ ) {
             printf("%c                         %d        %d
",graph[i]->name,result[i].indgree,result[i].outdgree);
             if( result[i].indgree == 0 )
                     printf("Source ");
             if( result[i].outdgree == 0 )
                     printf("Sinkn");
             else
                     printf("n");
     }
     free(result);
     UnInitGraph(n);
     printf("n계속하시려면 아무키나 누르세요....");
     getch();
}
void InitGraph(int n) {
     int i;
     graph = (Node **)malloc(n*sizeof(Node *));
     for( i = 0 ; i < n ; i++ ) {
             graph[i] = (Node *)malloc(sizeof(Node));
             graph[i]->next = NULL;
             graph[i]->prev = NULL;
     }
}

Node *AppendNode(Node *Target, Node *aNode) {
    Node *New;
    Node *Right;
    Node *tail;
    New = (Node *)malloc(sizeof(Node));
    for(tail=Target;tail->next;tail=tail->next);
    *New = *aNode;
    Right = tail->next;
    New->next = Right;
    New->prev = tail;
    tail->next = New;
    if (Right) {
            Right->prev = New;
    }
    return New;
}

int DeleteNode(Node *Target) {
     Node *Left, *Right;
     if( Target == NULL )
             return 0;
     Left = Target->prev;
     Right = Target->next;
     Left->next = Right;
     if (Right)
             Right->prev = Left;
     free(Target);
     return 1;
}

void UnInitGraph(int n) {
     int i;
     for( i = 0 ; i < n ; i++ )
             while(DeleteNode(graph[i]->next));
     free(graph);
     graph = NULL;
}




코딩결과

Contenu connexe

Tendances

이산치7보고서
이산치7보고서이산치7보고서
이산치7보고서KimChangHoen
 
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)Sang Don Kim
 
2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차Moonki Choi
 
2021 2학기 정기 세미나 5주차
2021 2학기 정기 세미나 5주차2021 2학기 정기 세미나 5주차
2021 2학기 정기 세미나 5주차Moonki Choi
 
이산치수학 Project5
이산치수학 Project5이산치수학 Project5
이산치수학 Project5KoChungWook
 
12 1. multi-dimensional array
12 1. multi-dimensional array12 1. multi-dimensional array
12 1. multi-dimensional array웅식 전
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdfkd19h
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
11. array & pointer
11. array & pointer11. array & pointer
11. array & pointer웅식 전
 
Day by day iPhone Programming
Day by day iPhone ProgrammingDay by day iPhone Programming
Day by day iPhone ProgrammingYoung Oh Jeong
 
자료구조 01 최종 보고서
자료구조 01 최종 보고서자료구조 01 최종 보고서
자료구조 01 최종 보고서pkok15
 
2012 Ds A1 05
2012 Ds A1 052012 Ds A1 05
2012 Ds A1 05seonhyung
 
2012 Dm C2 04
2012 Dm C2 042012 Dm C2 04
2012 Dm C2 04seonhyung
 
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
Project#1파스칼 삼각형
Project#1파스칼 삼각형Project#1파스칼 삼각형
Project#1파스칼 삼각형Kimjeongmoo
 

Tendances (19)

자료구조05
자료구조05자료구조05
자료구조05
 
자료구조05
자료구조05자료구조05
자료구조05
 
이산치7보고서
이산치7보고서이산치7보고서
이산치7보고서
 
이산치4번
이산치4번이산치4번
이산치4번
 
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
 
2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차
 
2021 2학기 정기 세미나 5주차
2021 2학기 정기 세미나 5주차2021 2학기 정기 세미나 5주차
2021 2학기 정기 세미나 5주차
 
이산치수학 Project5
이산치수학 Project5이산치수학 Project5
이산치수학 Project5
 
12 1. multi-dimensional array
12 1. multi-dimensional array12 1. multi-dimensional array
12 1. multi-dimensional array
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
11. array & pointer
11. array & pointer11. array & pointer
11. array & pointer
 
Day by day iPhone Programming
Day by day iPhone ProgrammingDay by day iPhone Programming
Day by day iPhone Programming
 
자료구조 01 최종 보고서
자료구조 01 최종 보고서자료구조 01 최종 보고서
자료구조 01 최종 보고서
 
2012 Ds A1 05
2012 Ds A1 052012 Ds A1 05
2012 Ds A1 05
 
2012 Dm C2 04
2012 Dm C2 042012 Dm C2 04
2012 Dm C2 04
 
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
 
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
 
Project#1파스칼 삼각형
Project#1파스칼 삼각형Project#1파스칼 삼각형
Project#1파스칼 삼각형
 

En vedette (20)

Palestra IBM - Seminário TiB
Palestra IBM - Seminário TiBPalestra IBM - Seminário TiB
Palestra IBM - Seminário TiB
 
Titanium Study Meeting in Hamamatsu LT
Titanium Study Meeting in Hamamatsu LTTitanium Study Meeting in Hamamatsu LT
Titanium Study Meeting in Hamamatsu LT
 
Apresentação fv sef2011
Apresentação fv sef2011Apresentação fv sef2011
Apresentação fv sef2011
 
Tucci_SME Paper_2016
Tucci_SME Paper_2016Tucci_SME Paper_2016
Tucci_SME Paper_2016
 
The Ultimate Marketing Stack
The Ultimate Marketing StackThe Ultimate Marketing Stack
The Ultimate Marketing Stack
 
Water Treatment Plants
Water Treatment PlantsWater Treatment Plants
Water Treatment Plants
 
Bal2012
Bal2012Bal2012
Bal2012
 
Blackall 66-22kV Substation Package for Ergon Energy
Blackall 66-22kV Substation Package for Ergon EnergyBlackall 66-22kV Substation Package for Ergon Energy
Blackall 66-22kV Substation Package for Ergon Energy
 
Sharda Tech | Business Description
Sharda Tech | Business Description Sharda Tech | Business Description
Sharda Tech | Business Description
 
Catalogo subli
Catalogo subliCatalogo subli
Catalogo subli
 
Senior Thesis
Senior ThesisSenior Thesis
Senior Thesis
 
Brico arreglo brazo limpias
Brico arreglo brazo limpiasBrico arreglo brazo limpias
Brico arreglo brazo limpias
 
C:\Fakepath\O Meu Dia TecnolóGico
C:\Fakepath\O Meu Dia TecnolóGicoC:\Fakepath\O Meu Dia TecnolóGico
C:\Fakepath\O Meu Dia TecnolóGico
 
Construcción del blog
Construcción del blogConstrucción del blog
Construcción del blog
 
Sie da wah(1)
Sie da wah(1)Sie da wah(1)
Sie da wah(1)
 
Responsabilidade Social na Masa da Amazônia
Responsabilidade Social na Masa da AmazôniaResponsabilidade Social na Masa da Amazônia
Responsabilidade Social na Masa da Amazônia
 
1.2
1.21.2
1.2
 
El w.c. d._
El w.c. d._El w.c. d._
El w.c. d._
 
QUE ENTENDEMOS POR CULTURA
QUE ENTENDEMOS POR CULTURAQUE ENTENDEMOS POR CULTURA
QUE ENTENDEMOS POR CULTURA
 
18
1818
18
 

Similaire à 이산수학 C1 프로젝트 5

2012 Ds D0 01
2012 Ds D0 012012 Ds D0 01
2012 Ds D0 01chl132435
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdfjinwookhong
 
5통신망에서 길 찾기
5통신망에서 길 찾기5통신망에서 길 찾기
5통신망에서 길 찾기herojoon1378
 
Project#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpProject#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpKimjeongmoo
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01seonhyung
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfjinwookhong
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfkd19h
 
2012 Dm C2 05
2012 Dm C2 052012 Dm C2 05
2012 Dm C2 05seonhyung
 
2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03chl132435
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기지수 윤
 
ffmpeg optimization using CUDA
ffmpeg optimization using CUDAffmpeg optimization using CUDA
ffmpeg optimization using CUDAyyooooon
 
프로젝트 보고서
프로젝트 보고서프로젝트 보고서
프로젝트 보고서hyungoh kim
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3mil23
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdfkd19h
 
2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02chl132435
 
Java Final Report
Java Final ReportJava Final Report
Java Final ReportHwangcy
 

Similaire à 이산수학 C1 프로젝트 5 (20)

2012 Ds D0 01
2012 Ds D0 012012 Ds D0 01
2012 Ds D0 01
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf
 
5통신망에서 길 찾기
5통신망에서 길 찾기5통신망에서 길 찾기
5통신망에서 길 찾기
 
Project#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpProject#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 Hwp
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
이산치2번
이산치2번이산치2번
이산치2번
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
이산치5번
이산치5번이산치5번
이산치5번
 
이산치1번
이산치1번이산치1번
이산치1번
 
2012 Dm C2 05
2012 Dm C2 052012 Dm C2 05
2012 Dm C2 05
 
2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 
ffmpeg optimization using CUDA
ffmpeg optimization using CUDAffmpeg optimization using CUDA
ffmpeg optimization using CUDA
 
프로젝트 보고서
프로젝트 보고서프로젝트 보고서
프로젝트 보고서
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3
 
자구2번
자구2번자구2번
자구2번
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf
 
2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02
 
Java Final Report
Java Final ReportJava Final Report
Java Final Report
 

Plus de pkok15

이산수학 C1 프로젝트 3
이산수학 C1 프로젝트 3이산수학 C1 프로젝트 3
이산수학 C1 프로젝트 3pkok15
 
자료구조 06 최종 보고서
자료구조 06 최종 보고서자료구조 06 최종 보고서
자료구조 06 최종 보고서pkok15
 
이산수학 C1 프로젝트 6
이산수학 C1 프로젝트 6이산수학 C1 프로젝트 6
이산수학 C1 프로젝트 6pkok15
 
이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7pkok15
 
이산수학 D1 프로젝트 1
이산수학 D1 프로젝트 1이산수학 D1 프로젝트 1
이산수학 D1 프로젝트 1pkok15
 
이산수학 D1 프로젝트 2
이산수학 D1 프로젝트 2이산수학 D1 프로젝트 2
이산수학 D1 프로젝트 2pkok15
 
자료구조 02 최종 보고서
자료구조 02 최종 보고서자료구조 02 최종 보고서
자료구조 02 최종 보고서pkok15
 
자료구조 03 최종 보고서
자료구조 03 최종 보고서자료구조 03 최종 보고서
자료구조 03 최종 보고서pkok15
 
자료구조 04 최종 보고서
자료구조 04 최종 보고서자료구조 04 최종 보고서
자료구조 04 최종 보고서pkok15
 
자료구조 05 최종 보고서
자료구조 05 최종 보고서자료구조 05 최종 보고서
자료구조 05 최종 보고서pkok15
 

Plus de pkok15 (10)

이산수학 C1 프로젝트 3
이산수학 C1 프로젝트 3이산수학 C1 프로젝트 3
이산수학 C1 프로젝트 3
 
자료구조 06 최종 보고서
자료구조 06 최종 보고서자료구조 06 최종 보고서
자료구조 06 최종 보고서
 
이산수학 C1 프로젝트 6
이산수학 C1 프로젝트 6이산수학 C1 프로젝트 6
이산수학 C1 프로젝트 6
 
이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7
 
이산수학 D1 프로젝트 1
이산수학 D1 프로젝트 1이산수학 D1 프로젝트 1
이산수학 D1 프로젝트 1
 
이산수학 D1 프로젝트 2
이산수학 D1 프로젝트 2이산수학 D1 프로젝트 2
이산수학 D1 프로젝트 2
 
자료구조 02 최종 보고서
자료구조 02 최종 보고서자료구조 02 최종 보고서
자료구조 02 최종 보고서
 
자료구조 03 최종 보고서
자료구조 03 최종 보고서자료구조 03 최종 보고서
자료구조 03 최종 보고서
 
자료구조 04 최종 보고서
자료구조 04 최종 보고서자료구조 04 최종 보고서
자료구조 04 최종 보고서
 
자료구조 05 최종 보고서
자료구조 05 최종 보고서자료구조 05 최종 보고서
자료구조 05 최종 보고서
 

이산수학 C1 프로젝트 5

  • 1. project #4 통신망에서 길 찾기 이산치수학 C1조 20083458 민영지 20093474 박구남 20093526 정준용 20093530 최고봉
  • 2. 순서 •조원별 업무분담 •일정 계획 •문제 파악 •알고리즘 계획 •소스구현 •문제점 파악 / 해결법 토의 •최종소스
  • 3. 1)조원별 업무 분담 최종 보고서 작성 및 프로젝트 총괄 민영지 및 자료 조사 박구남 알고리즘 구상 및 소스 구현 정준용 알고리즘 구상 및 소스 구현 최고봉 알고리즘 구상 및 소스 구현 2)일정계획 과제에 대한 자료 조사 및 업무분담 05.14~05.16 일정 계획 프로젝트 알고리즘 구성 및 소스 구 05.16~05.21 현 05.21~05.23 최종 소스 확인 및 최종보고서 작성
  • 4. 3)문제파악 Degree 출력 -adjacent matrix가 주어졌을 때 indegree/outdegree를 출력하고 source/sink를 구별하시오. -입력 4 AB, BD, CB, DC -출력 A 0 1 source B 2 1 C 1 1 D 1 1
  • 5. 4)알고리즘 계획 노드의 개수를 입력 받은 후 그 개수만큼의 빈 Node를 만든 다. 입력받은 Edge의 값과 비교하여 indegree와 outdegree의 값을 증가시킨다. 출력하는 부분에서 indegree의 값이 0이면 Source, outdegree의 값이 0이면 Sink를 출력하고 끝낸다. 5)소스 구현 1차 소스 #include <stdio.h> #include <stdlib.h> typedef struct Node { char name; struct Node *next; struct Node *prev; }Node; typedef struct rst { int indgree; int outdgree; }rst; Node **graph; void InitGraph(int n); Node *AppendNode(Node *Target, Node *aNode); int DeleteNode(Node *Target); void UnInitGraph(int n);
  • 6. void main() { int n, i, j, x; char name[3]; Node *Now, temp; rst *result; temp.name = 0; temp.next = NULL; temp.prev = NULL; printf("노드의 개수를 입력해주세요.n"); scanf("%d",&n); result = (rst *)malloc(n*sizeof(rst)); for( i = 0 ; i < n ; i++ ) { result[i].indgree = 0; result[i].outdgree = 0; } InitGraph(n); printf("Edge를 입력해주세요.(예, AB, BD)n입력을 끝내시려면 0을 입력하세요.n"); while(1) { scanf("%s",name); if( name[0] == '0' ) break; for( x = 0 ; x < n ; x++ ) { Now = graph[x]; if( graph[x]->name == name[0] ) { temp.name = name[1]; AppendNode(Now,&temp); result[x].outdgree++; break; } else if( graph[x]->next == NULL ) { graph[x]->name = name[0]; temp.name = name[1]; AppendNode(Now,&temp); result[x].outdgree++; break; } } } for( i = 0, j = 0 ; ; j++ ) {
  • 7. if( j >= n ) { j = -1; i++; if( i >= n ) break; continue; } Now = graph[j]->next; while(1) { if( Now == NULL ) break; if( graph[i]->name == Now->name ) result[i].indgree++; Now = Now->next; } } for( i = 0 ; i < n ; i++ ) { printf("%c %d %d ", graph[i]->name, result[i].indgree, result[i].outdgree); if( result[i].indgree == 0 ) printf("Source"); else if( result[i].outdgree == 0 ) printf("Sink"); printf("n"); } free(result); UnInitGraph(n); printf("n계속하시려면 아무키나 누르세요...."); getch(); system("PAUSE"); } void InitGraph(int n) { int i; graph = (Node **)malloc(n*sizeof(Node *)); for( i = 0 ; i < n ; i++ ) { graph[i] = (Node *)malloc(sizeof(Node)); graph[i]->next = NULL; graph[i]->prev = NULL; }
  • 8. } Node *AppendNode(Node *Target, Node *aNode) { Node *New; Node *Right; Node *tail; New = (Node *)malloc(sizeof(Node)); for(tail=Target;tail->next;tail=tail->next); *New = *aNode; Right = tail->next; New->next = Right; New->prev = tail; tail->next = New; if (Right) { Right->prev = New; } return New; } int DeleteNode(Node *Target) { Node *Left, *Right; if( Target == NULL ) return 0; Left = Target->prev; Right = Target->next; Left->next = Right; if (Right) Right->prev = Left; free(Target); return 1; } void UnInitGraph(int n) { int i; for( i = 0 ; i < n ; i++ ) while(DeleteNode(graph[i]->next)); free(graph); graph = NULL; }
  • 9. 1차 소스 문제점 - 입력하여 출력할 때 Sink가 되면 제대로 출력되지 않았다. for( i = 0 ; i < n ; i++ ) { printf("%c %d %d ", graph[i]->name, result[i].indgree, result[i].outdgree); if( result[i].indgree == 0 ) printf("Source"); else if( result[i].outdgree == 0 ) printf("Sink"); printf("n"); } 최종소스 #include <stdio.h> #include <stdlib.h> typedef struct Node { char name; struct Node *next; struct Node *prev; }Node; typedef struct rst { int indgree; int outdgree; }rst; Node **graph; void InitGraph(int n); Node *AppendNode(Node *Target, Node *aNode); int DeleteNode(Node *Target); void UnInitGraph(int n); void main() { int n, i, j, x; char name[3];
  • 10. Node *Now, temp; rst *result; temp.name = 0; temp.next = NULL; temp.prev = NULL; printf("노드의 개수를 입력해주세요.n"); scanf("%d",&n); result = (rst *)malloc(n*sizeof(rst)); for( i = 0 ; i < n ; i++ ) { result[i].indgree = 0; result[i].outdgree = 0; } InitGraph(n); printf("Edge를 입력해주세요.(예, AB, BD)n입력을 끝내시려면 0 을 입력하세요.n"); while(1) { scanf("%s",name); if( name[0] == '0' ) break; for( x = 0 ; x < n ; x++ ) { Now = graph[x]; if( graph[x]->name == name[0] ) { temp.name = name[1]; AppendNode(Now,&temp); result[x].outdgree++; break; } else if( graph[x]->next == NULL ) { graph[x]->name = name[0]; temp.name = name[1]; AppendNode(Now,&temp); result[x].outdgree++; break; } } for( x = 0 ; x < n ; x++ ) { Now = graph[x]; if( graph[x]->name == name[1] ) { break; }
  • 11. else if( graph[x]->next == NULL ) { graph[x]->name = name[1]; temp.name = '0'; AppendNode(Now,&temp); break; } } } for( i = 0, j = 0 ; ; j++ ) { if( j >= n ) { j = -1; i++; if( i >= n ) break; continue; } Now = graph[j]->next; while(1) { if( Now == NULL ) break; if( graph[i]->name == Now->name ) result[i].indgree++; Now = Now->next; } } for( i = 0 ; i < n ; i++ ) { printf("%c %d %d ",graph[i]->name,result[i].indgree,result[i].outdgree); if( result[i].indgree == 0 ) printf("Source "); if( result[i].outdgree == 0 ) printf("Sinkn"); else printf("n"); } free(result); UnInitGraph(n); printf("n계속하시려면 아무키나 누르세요...."); getch(); }
  • 12. void InitGraph(int n) { int i; graph = (Node **)malloc(n*sizeof(Node *)); for( i = 0 ; i < n ; i++ ) { graph[i] = (Node *)malloc(sizeof(Node)); graph[i]->next = NULL; graph[i]->prev = NULL; } } Node *AppendNode(Node *Target, Node *aNode) { Node *New; Node *Right; Node *tail; New = (Node *)malloc(sizeof(Node)); for(tail=Target;tail->next;tail=tail->next); *New = *aNode; Right = tail->next; New->next = Right; New->prev = tail; tail->next = New; if (Right) { Right->prev = New; } return New; } int DeleteNode(Node *Target) { Node *Left, *Right; if( Target == NULL ) return 0; Left = Target->prev; Right = Target->next; Left->next = Right; if (Right) Right->prev = Left; free(Target); return 1;
  • 13. } void UnInitGraph(int n) { int i; for( i = 0 ; i < n ; i++ ) while(DeleteNode(graph[i]->next)); free(graph); graph = NULL; } 코딩결과