ZOJ-1203 Swordfish---最小生成树

题目链接:

https://vjudge.net/problem/ZOJ-1203

题目大意:

给定平面上N个城市的位置,计算连接这N个城市所需线路长度总和的最小值。

思路:

模板题

最小生成树,Prim求解。注意两个城市之间都有一条边相连。还有每两组输出之间空一行。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 #include<stack>
 8 #include<map>
 9 #include<sstream>
10 using namespace std;
11 typedef long long ll;
12 const int maxn = 2e2 + 10;
13 const int INF = 1 << 30;
14 int dir[4][2] = {1,0,0,1,-1,0,0,-1};
15 int T, n, m;
16 double Map[maxn][maxn];//存图
17 double lowcost[maxn];
18 int mst[maxn];
19 void prim(int u)//最小生成树起点
20 {
21     double sum_mst = 0;//最小生成树权值
22     for(int i = 1; i <= n; i++)//初始化两个数组
23     {
24         lowcost[i] = Map[u][i];
25         mst[i] = u;
26     }
27     mst[u] = -1;//设置成-1表示已经加入mst
28     for(int i = 1; i <= n; i++)
29     {
30         double minn = 1.0 * INF;
31         int v = -1;
32         //在lowcost数组中寻找未加入mst的最小值
33         for(int j = 1; j <= n; j++)
34         {
35             if(mst[j] != -1 && lowcost[j] < minn)
36             {
37                 v = j;
38                 minn = lowcost[j];
39             }
40         }
41         if(v != -1)//v=-1表示未找到最小的边,
42         {//v表示当前距离mst最短的点
43             //printf("%d %d %d\n", mst[v], v, lowcost[v]);//输出路径
44             mst[v] = -1;
45             sum_mst += lowcost[v];
46             for(int j = 1; j <= n; j++)//更新最短边
47             {
48                 if(mst[j] != -1 && lowcost[j] > Map[v][j])
49                 {
50                     lowcost[j] = Map[v][j];
51                     mst[j] = v;
52                 }
53             }
54         }
55     }
56     //printf("weight of mst is %d\n", sum_mst);
57     printf("The minimal distance is: %.2f\n", sum_mst);
58 }
59 double x[105], y[105];
60 int cases;
61 int main()
62 {
63     while(cin >> n && n)
64     {
65         if(cases)cout<<endl;
66         for(int i = 1; i <= n; i++)cin >> x[i] >> y[i];
67         for(int i = 1; i <= n; i++)
68         {
69             for(int j = 1; j <= n; j++)
70             {
71                 Map[i][j] = sqrt((x[j] - x[i]) * (x[j] - x[i]) + (y[j] - y[i]) * (y[j] - y[i]));
72             }
73         }
74         printf("Case #%d:\n", ++cases);
75         prim(1);
76     }
77     return 0;
78 }

 

posted @ 2018-04-05 21:56  _努力努力再努力x  阅读(162)  评论(0编辑  收藏  举报