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 }
越努力,越幸运