zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", sum_mst);
    57     printf("The minimal distance is: %.2f
    ", 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:
    ", ++cases);
    75         prim(1);
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    Vue 从入门到进阶之路(十四)
    Vue 从入门到进阶之路(十三)
    Vue 从入门到进阶之路(十二)
    Vue 从入门到进阶之路(十一)
    vue-cli 3.x 开发插件并发布到 npm
    2018 年终总结 & 2019 年度计划
    帝都夜话
    移动端实现拖拽的两种方法
    前端面试(原生js篇)
    在前端获取图片宽高
  • 原文地址:https://www.cnblogs.com/fzl194/p/8724459.html
Copyright © 2011-2022 走看看