Hãy giúp bộ xây dựng xây dựng xây dựng hệ thống đường sắt với yêu cầu trên với chi phí xây dựng nhỏ nhất.
[Input]
Dữ liệu đầu vào được chứa trong file WELLPROJECT.INP, dòng đầu chứa số lượng test case T ( T ≤ 10). Tiếp đó là N - Số thành phố. N dòng tiếp theo là ma trận chi phí xây dựng đường sắt nối liền 2 thành phố bất kỳ.
[Output]
In ra file WELLPROJECT.OUT chi phí nhỏ nhất xây dựng hệ thống đướng sắt trên. Kết quả của mỗi test case đươc in ra trên một dòng.
[Input example]
5
3
0 1 4
1 0 2
4 2 0
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
6
0 45 86 12 61 51
45 0 80 99 18 2
86 80 0 9 37 14
12 99 9 0 14 90
61 18 37 14 0 52
51 2 14 90 52 0
10
0 1 1 1 1 1 1 1 1 1
1 0 1 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 1 0 1 1 1 1 1
1 1 1 1 1 0 1 1 1 1
1 1 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 0 1 1
1 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 0
10
0 40613 19297 99549 27948 50416 95139 82856 99082 79380
40613 0 96888 46784 65549 8396 18128 31348 94809 16773
19297 96888 0 83011 20456 42383 34635 86957 85569 95179
99549 46784 83011 0 24003 66861 44068 11524 97968 22654
27948 65549 20456 24003 0 16590 54758 37348 62125 17814
50416 8396 42383 66861 16590 0 67234 14142 90848 64960
95139 18128 34635 44068 54758 67234 0 81632 81223 19101
82856 31348 86957 11524 37348 14142 81632 0 38508 16462
99082 94809 85569 97968 62125 90848 81223 38508 0 37607
79380 16773 95179 22654 17814 64960 19101 16462 37607 0
[Output example]
3
28
51
9
162602
Chương trình giải bài toán trên được cài đặt theo thuật toán Prim như sau:
#include<iostream> #include<conio.h> using namespace std; #define NMax 101 int map[NMax][NMax]; bool isVisited[NMax]; #define LENGTHMAX 1000000 int main(){ freopen("WELLPROJECT.INP","r", stdin); freopen("WELLPROJECT.OUT","w", stdout); int T; cin>>T; for(int tc = 0; tc < T; tc++){ int verticeCount; cin>>verticeCount; for(int i =1; i<= verticeCount; i++){ // khởi tạo giá trị mảng visited. isVisited[i] = false; for(int j= 1;j <= verticeCount ; j++){ cin>>map[i][j]; } } // Prim algorithm. // bắt đầu từ đỉnh 1. isVisited[1] = true; int countEdge = 0; int sumOfEdge = 0; // Vòng lặp, thăm các đỉnh để tạo cây khung nhỏ nhất. while(countEdge < verticeCount - 1){ int tempLength = LENGTHMAX; int tempVertice = 1; for(int i=1 ;i <= verticeCount; i++){ if(isVisited[i]){ for(int j=1; j <= verticeCount ; j++){ if(j != i && !isVisited[j] && map[i][j] > 0 && map[i][j] < tempLength){ tempLength = map[i][j]; tempVertice = j; } } } } countEdge++; isVisited[tempVertice]= true; sumOfEdge += tempLength; } cout<<sumOfEdge<<endl; } }
1 Comment to "[Bài toán] Xây dựng đường sắt"
Mình có 4 điểm với lat/lon:
lat: 42.9139278, lon: 143.2277417
lat: 42.9934806, lon: 144.3699194
lat: 42.9949444, lon: 144.4129806
lat: 43.7958639, lon: 143.84125
làm sao để ứng dụng vậy ạ.
Post a Comment