[정올] 1060 : 최소비용신장트리
1060 : 최소비용신장트리
제한시간: 1000 ms 메모리제한: 32 MB
해결횟수: 1501 회 시도횟수: 4157 회
정보올림피아드 공부를 더욱 효율적으로 할 수 있도록 전국에 흩어져 있는 정올 학원들을 네트워크로 연결하려고 한다.그러나 모든 학원들을 네트워크로 연결하려면 너무 많은 비용이 필요하기 때문에 정올에서는 학원들을 연결하는 비용을 최소가 되게 하려고 한다. 학원들은연결되어 있는 다른 학원의 회선을 공유할 수 있다.
아래 그림과 같이 학원 사이를 연결하기 위한 비용이 주어지면 모든 학원을 연결하기 위한 최소의 비용을 구하는 프로그램을 작성하라.
첫줄에 학원의 수 N(3≤N≤100)이 주어진다.둘째 줄부터 NxN의 행렬로 100,000이하의 정수가 공백으로 구분되어 입력된다. 행렬의 i j는 i번 학원에서 j번 학원을 연결하기 위한 비용을 나타낸다.
학원들을 모두 연결하기 위한 최소 비용을 출력한다.
5 0 5 10 8 7 5 0 5 3 6 10 5 0 1 3 8 3 1 0 1 7 6 3 1 0 | 10 |
출처 : jungol
[소스코드]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <stdio.h> #include <stdlib.h> int main() { int i,j; int n; int min; scanf("%d",&n); int **arr = NULL; arr = (int **)malloc(sizeof(int *)*n); for(i = 0; i <n; i++) { *(arr+i) = (int *)malloc(sizeof(int)*n); } for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { scanf("%d",&arr[i][j]); } } int count = n; int small; int sum = 0; int *result = (int *)malloc(sizeof(int)*n); for(i = 1; i < n; i++) { result[i]=arr[0][i]; } result[0] = -1; while(count != 1) { min = 50; for(i = 1; i < n; i++) { if(result[i] > 0 && result[i] < min) { min = result[i]; small = i; } } //i번째 정점의 최솟값이 되는 값 sum += result[small]; result[small] = -1; for(i = 1; i < n; i++) { if(result[i] > arr[i][small]) { result[i] = arr[i][small]; } } count--; } printf("%d",sum); } | cs |
'Programming > C' 카테고리의 다른 글
[정올] 530 : 선택제어문 - 자가진단3 (0) | 2019.11.21 |
---|---|
[정올] 529 : 선택제어문 - 자가진단2 (0) | 2019.11.21 |
[정올] 528 : 선택제어문 - 자가진단1 (0) | 2019.11.21 |
[정올] 1106 : 정올 (0) | 2018.06.13 |
[정올] 1331 : 문자마름모 (0) | 2017.08.12 |
댓글
이 글 공유하기
다른 글
-
[정올] 529 : 선택제어문 - 자가진단2
[정올] 529 : 선택제어문 - 자가진단2
2019.11.21 -
[정올] 528 : 선택제어문 - 자가진단1
[정올] 528 : 선택제어문 - 자가진단1
2019.11.21 -
[정올] 1106 : 정올
[정올] 1106 : 정올
2018.06.13 -
[정올] 1331 : 문자마름모
[정올] 1331 : 문자마름모
2017.08.12