project #5



  최단 경로 찾기


             C0조



             김영진
             강성태
             정준용
             허규준
             김지환
순서




      •조원별 업무분담


         •일정 계획


         •문제 파악


       •알고리즘 계획


          •소스구현


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


          •최종소스
1)조원별 업무 분담

김영진           자료 조사 및 알고리즘 구현



강성태           자료 조사 및 알고리즘 구현



정준용           보고서 작성 및 소스 작성



허규준           알고리즘 구현 및 소스 작성



김지환           알고리즘 구현 및 소스 작성




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

              프로젝트 알고리즘 구성 및 소스 구
05.29~06.01
              현


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


。노드가 n(V1, V2, ... Vn)개인 그래프 G가 있다. V1에
서 Vn까지의 패스를 P=(p1, p2, ... pm)이라고 할 경우,
P에서 3개의 최단거리를 찾아라.


。다음과 같은 프로그램을 작성한다.
 。다음과 같은 포맷을 가진 파일에서 정보를 읽어 들인다.

  。첫번째 라인은 그래프 노드의 수 n이 있다.

  。두번째 라인부터 끝까지 다음과 같이 3수를 가지고 있다.

  。Vi, Vj, Wij : 여기서 Vi는 간선의 시작 노드, Vj는 간선의 끝

   노드 그리고 그 간선의 가중치를 Wij이다.

 。V1에서 Vn까지의 가장 짧은 패스 3개를 찾아라.

 。3개의 패스를 화면에 표시하고 가중치의 합을 표시한다.

。어떤 자료구조 / 알고리즘을 사용해도 됨.
4)알고리즘 계획


    최단거리를 구해주는 Floyd 알고리즘을 사용해 모든 노드의
가중치 중 가장 작은 가중치를 가진 패스 3개를 찾을 것입니
다.



5)소스 구현

#include<stdio.h>
#define M 9999


int main()
{
      int a[20][20],min=1;
      int i=0,j=0,k,l=0,num,weight=0;
      int start,end,line,cnt=1,stopcnt=0;
      char c,d;


      for(i=0;i<20;i++)
      {
             for(j=0;j<20;j++)
             {
                     a[i][j]=M;
             }
             a[i][i]=0;
      }
printf("노드의 갯수를 입력하십시오n");
scanf("%d",&num);
printf("간선의 갯수를 입력하십시오n");
scanf("%d",&line);
fflush(stdin);
for(i=0;i<line;i++)
{
       scanf("%c %c %d",&c,&d,&weight);
       a[c-65][d-65]=weight;
       a[d-65][c-65]=weight;
       fflush(stdin);
}




for(k=0;k<num;k++)
{
       for(i=0;i<num;i++)
       {
                 for(j=0;j<num;j++)
                 {
                        if(a[i][j]>a[i][k]+a[k][j])
                        {
                                a[i][j]=a[i][k]+a[k][j];


                        }
                 }
       }
}
for(i=0;i<num;i++)
            {
                      for(j=0;j<num;j++)
                      {
                               printf("%d ",a[i][j]);
                      }
                      printf("n");
            }


            for(;;)
            {
                      cnt=1;
                      for(j=0;j<num;j++)
                      {
                               for(i=cnt;i<num;i++)
                               {
                                        if(a[j][i]==min)
                                        {
                                               printf("%c -> %c = %dn", j+65, i+65,
a[j][i]);
                                               stopcnt++;
                                               if(stopcnt==3)
                                               {
                                                        return 0;
                                               }
                                        }
                               }
                               cnt++;
                      }
min++;
     }
}



6)문제점

    프로젝트의 원래 의도는 파일에서 입력받아 그 값 중 가장
짧은 패스 3개를 출력하는 것이지만 파일 입력의 개념을 확
실히 숙지하지 못하여 프로그램의 메인 함수 내에서 입력받
아 출력하였습니다.



코딩결과

자료구조05

  • 1.
    project #5 최단 경로 찾기 C0조 김영진 강성태 정준용 허규준 김지환
  • 2.
    순서 •조원별 업무분담 •일정 계획 •문제 파악 •알고리즘 계획 •소스구현 •문제점 파악 / 해결법 토의 •최종소스
  • 3.
    1)조원별 업무 분담 김영진 자료 조사 및 알고리즘 구현 강성태 자료 조사 및 알고리즘 구현 정준용 보고서 작성 및 소스 작성 허규준 알고리즘 구현 및 소스 작성 김지환 알고리즘 구현 및 소스 작성 2)일정계획 과제에 대한 자료 조사 및 업무분담 05.24~05.29 일정 계획 프로젝트 알고리즘 구성 및 소스 구 05.29~06.01 현 06.01~06.07 최종 소스 확인 및 최종보고서 작성
  • 4.
    3)문제파악 。노드가 n(V1, V2,... Vn)개인 그래프 G가 있다. V1에 서 Vn까지의 패스를 P=(p1, p2, ... pm)이라고 할 경우, P에서 3개의 최단거리를 찾아라. 。다음과 같은 프로그램을 작성한다. 。다음과 같은 포맷을 가진 파일에서 정보를 읽어 들인다. 。첫번째 라인은 그래프 노드의 수 n이 있다. 。두번째 라인부터 끝까지 다음과 같이 3수를 가지고 있다. 。Vi, Vj, Wij : 여기서 Vi는 간선의 시작 노드, Vj는 간선의 끝 노드 그리고 그 간선의 가중치를 Wij이다. 。V1에서 Vn까지의 가장 짧은 패스 3개를 찾아라. 。3개의 패스를 화면에 표시하고 가중치의 합을 표시한다. 。어떤 자료구조 / 알고리즘을 사용해도 됨.
  • 5.
    4)알고리즘 계획 최단거리를 구해주는 Floyd 알고리즘을 사용해 모든 노드의 가중치 중 가장 작은 가중치를 가진 패스 3개를 찾을 것입니 다. 5)소스 구현 #include<stdio.h> #define M 9999 int main() { int a[20][20],min=1; int i=0,j=0,k,l=0,num,weight=0; int start,end,line,cnt=1,stopcnt=0; char c,d; for(i=0;i<20;i++) { for(j=0;j<20;j++) { a[i][j]=M; } a[i][i]=0; }
  • 6.
    printf("노드의 갯수를 입력하십시오n"); scanf("%d",&num); printf("간선의갯수를 입력하십시오n"); scanf("%d",&line); fflush(stdin); for(i=0;i<line;i++) { scanf("%c %c %d",&c,&d,&weight); a[c-65][d-65]=weight; a[d-65][c-65]=weight; fflush(stdin); } for(k=0;k<num;k++) { for(i=0;i<num;i++) { for(j=0;j<num;j++) { if(a[i][j]>a[i][k]+a[k][j]) { a[i][j]=a[i][k]+a[k][j]; } } } }
  • 7.
    for(i=0;i<num;i++) { for(j=0;j<num;j++) { printf("%d ",a[i][j]); } printf("n"); } for(;;) { cnt=1; for(j=0;j<num;j++) { for(i=cnt;i<num;i++) { if(a[j][i]==min) { printf("%c -> %c = %dn", j+65, i+65, a[j][i]); stopcnt++; if(stopcnt==3) { return 0; } } } cnt++; }
  • 8.
    min++; } } 6)문제점 프로젝트의 원래 의도는 파일에서 입력받아 그 값 중 가장 짧은 패스 3개를 출력하는 것이지만 파일 입력의 개념을 확 실히 숙지하지 못하여 프로그램의 메인 함수 내에서 입력받 아 출력하였습니다. 코딩결과