码迷,mamicode.com
首页 > 其他好文 > 详细

地铁规划

时间:2014-11-10 11:49:56      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   color   ar   os   sp   

Description

地铁,其优势在于覆盖面广方便出行。某城市考虑在全市修建地铁。目前已确定各大地铁站点,并预估两两站点之间修建地铁的成本。政府部门希望能尽可能地节省开支,同时也希望本次项目可以覆盖到全市各大站点,目前亟需一份相关的成本预算。你可以计算出该项目的最小成本吗?

Input

可能有多个测试输入,第一行给出总共的测试输入的个数。

对于每个测试输入,第一行包含一个正整数N,接下来是N行铁道信息。每一行有N个整数X(0<N<100,0<X<10000),表示站点A和站点B之间修建地铁的成本为X。其中各站点到自身的成本视为0。

Output

输出一个整数,即地铁项目的最小成本。

Sample Input

2
3
0 1 100
1 0 2
100 2 0
4
0 2 3 4
2 0 4 1
3 4 0 5
4 1 5 0

sampleoutput

3

6

这道题用了最小生成树prim算法(我也是看了题解才会的)

prim算法就是选取一个点,然后找到距离这个点权值最小的下一个点(这道题我是先选站点1作为第一个点,因为循环比较好写,但是也可以选其它点作为起点,权值的意思就是选距离选定点的最短路径的那个点,如果有两个点距离相同,那么选择站点数较小的那个点),然后在把下一个点作为选定点,以此类推,直到把所有的站点都包括进来。注意我们要找的最小值是已经选定的点到未选定的点的最小值。

那测例2来说明就是:当前存在4个站点,我们选站点1作为起点,此时最短路径为0,发现站点1到站点2的距离最短,所以我们选取站点2作为下一个点,此时最短路径为2。因此站点2是也是选定点,然后我们发现站点1,站点2(已经选定的点)中到站点3,站点4(还没有选的点)的最短路径是站点2到站点4,所以我们把站点4作为选定点,此时最短路径为3,最后我们发现1,2,4到3的最短路径是1到3,所以最后把3作为选定点,最短路径为6,此时我们发现所有点都被选定了,因此证明所有的点都有路径经过,所以输出最短路径6。

 

最后贴上代码。。。。

bubuko.com,布布扣
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstring> 
 4 #include <cstdio>
 5 // 感谢这位大牛的博客 
 6 //http://www.cnblogs.com/Veegin/archive/2011/04/29/2032388.html
 7 using namespace std;
 8 
 9 int main () {
10   int T;
11   cin >> T;
12   while (T--) {
13     int N;
14     cin >> N;
15     int road[N][N];
16     int low[N]; 
17     for (int i = 0; i < N; i++) {
18       for (int j = 0; j < N; j++) { 
19         scanf("%d", &road[i][j]);
20       }
21       low[i] = road[0][i];
22     }
23     int i, j,pos, res = 0, min;
24     int visited[N];
25     memset(visited, 0, sizeof(visited));
26     visited[0] = 0; // 从A点开始标记 
27     pos = 0; // 记录该点 
28     for (i = 0; i < N; i++) { // 通过循环找到该行最小的距离 执行n - 1 次 
29       min = 10000; // 把min设置成最大的 
30       for (j = 0; j < N; j++) {
31         if (visited[j] == 0 && min > low[j]) {
32           min = low[j];
33           pos = j;
34         }
35       }
36       res += min; // 累加最小权重 
37       visited[pos] = 1; // 说明pos所在的站已经有线路通过了 
38       for (j = 0; j < N; j++) {
39         if (visited[j] == 0 && low[j] > road[pos][j]) // 这个是通过已经找到的pos的那行去找还没有经过的站点的最小值 
40           low[j] = road[pos][j];
41       }
42     }
43     cout << res << endl;
44   }
45   system("pause");
46 }
View Code

 

 

地铁规划

标签:des   style   blog   http   io   color   ar   os   sp   

原文地址:http://www.cnblogs.com/tonyyangsysu/p/4086633.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!