1. 이산치 수학
결과 보고서
Project#4
Syntax of Language
과목 : 이산치 수학
담당교수님 : 차정원교수님
조원 : C2조 김선형, 김정훈, 김지환, 이태구
2. 프로젝트 목표
그래프가 주어질 경우 MST(Minimum Spanning Tree)를 출력하는 프로그램 작성.
역할분담
조장 : 김선형
자료조사 : 김선형, 김정훈, 김지환
프로그래밍 : 이태구
프로젝트 일정
4/25 5/9 5/11
설계 및
역할분담
관련 자료 수집
프로그래밍
4. 초안에서는 크루스칼의 알고리즘의 순서인 우선 입력을 받고 오름차순을 정렬하여 다음 과
정인 사이클을 생성하면 두 정점을 포함 시키지 않고 생성 하지 않으면 두 정점을 포함시키
는 방법을 계속 하는 방식이 크루스칼의 알고리즘이다.
초안에서 대부분완성을 해두고 최종안에서는 깔끔하게 정리만 하려고 했으나 2단계인 사이
클을 정리하는 과정이 생각보다 까다로워서 초안에서는 오름차순으로만 정렬하고 깔끔하게
정리 하는것 까지 마무리시켰다.
<최종안>
#include <stdio.h>
#include <stdlib.h>
//크루스칼의 알고리즘을 이용하여 소스를 작성
int main()
{
int *array,a,b,c,d,sum=0;
char e,f,g,h;
printf("노드의 갯수 입력 : ");
scanf("%d",&a);
//노드의 수
//0을 입력하면 그래프가 없다고 생각함
array=(int*)malloc(sizeof(int)*a);
c=65;
d=66;
e=c;
for(b=0; b<(a*(a-1))/2; b++)
{
printf("%c%c : ",c,d);
if(e+a-1!=d)
{
d=d+1;
}
else
{
c=c+1;
d=c+1;
}
scanf("%d",&array[b]);
}
//그래프 성분입력
5. for(f=0; f<(a*(a-1))/2; f++)
{
for(g=f; g<(a*(a-1))/2; g++)
{
if(array[f]>array[g])
{
h=array[f];
array[f]=array[g];
array[g]=h;
}
}
}
//오름차순으로 정렬
for(b=0; b<a-1; b++)
{
if(array[b]>0)
{
printf("%dn",array[b]);
if(array[b]==array[b+1]&&array[b+1]==array[b+2])
{
a=a+1;
b=b+1;
}
sum=array[b]+sum;
}
else
{
a=a+1;
}
}
printf("MST의 비용의 합: %dn",sum);
//사이클을 나타내는 부분을 제외하고 출력하는 부분
return 0;
}
최종안에서는 초안에 있었던 내용을 바탕으로 크루스칼의 알고리즘인 사이클 생성 유무에
대해 포털사이트를 통해서 크루스칼 알고리즘에 대해 조금 더 자세히 알아보고 난 뒤 여러
가지 시행착오를 거치면서 최종적인 소스를 완성하였다. 홈페이지에 나와있는 출력방식이
아닌 다른 방식을 사용한 이유는 MST(최소신장트리)가 여러 가지 존재하는 경우의 수도
나올 수 있다고 생각해서 비용만 파악하더라도 MST를 쉽게 구분할 수 있게 하기 위해서
MST를 이루는 비용만 출력하였다
6. 프로젝트 후 느낀 점
이번과제에도 시작부터 어려운 점이 많아 저번처럼 난항을 겪으면서 시작했는데 첫 번째로
대부분 과제를 받으면 문제는 대충 파악하고 시작하지만 이번에는 문제를 파악하고 어떤 알
고리즘을 사용할지도 막막한 과정에서 우선 MST에 대한 내용을 검색하다보면서 여러 가지
알고리즘을 공부하면서 소스를 작성할 때 쉽고 간편하게 작성할 수 있는 것으로 접근하면서
초안을 거치고 최종안까지 가면서 여러 가지 시도를 한 끝에 최종적인 소스를 완성하게 되
었다.