HDU-1875-畅通工程再续

来源:互联网 发布:wtaps15aw军裤数据 编辑:程序博客网 时间:2024/05/16 06:34
题解:先求出每个岛之间的距离,然后再赋值给邻接矩阵,一个要注意的地方是:将距离大于0.0且小于10.0的距离,赋一个大于1000.0的数。接着就用Prim算法求解。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double map[105][105];
#define MAX 1000.0
#define MIN 10.0
struct

{

        int x;
        int y;
};
double Distance(G w1, G w2) 

{

        int wx = abs(w1.x - w2.x);
        int wy = abs(w1.y - w2.y);
        double w = sqrt(wx*wx + wy*wy);
        return w;
}   //求两岛之间距离
bool used[105];
double lowcost[105] = { 0 };
void Prim(int n) 

{
         double minsum = 0.0;
         for (int i = 0; i < n; i++) 

         {
                 lowcost[i] = map[0][i];
                 used[i] = false;
         }
         used[0] = true;
         int m = 1;
         for (int j = 0; j < n; j++) 

         {

                 double min = MAX;

                 int v = -1;
                 for(int k = 0; k < n; k++) 

                {
                         if (!used[k] &&lowcost[k] <= min)

                         {
                                  min = lowcost[k];
                                  v = k;
                          }
               }
               if(v != -1) 

               {
                        m++;
                        used[v] = true;
                        minsum += lowcost[v];
                        for (int t = 0; t < n; t++) 

                       {
                               if (!used[t] && map[v][t] < lowcost[t])
                                     lowcost[t] = map[v][t];
                       }
               }
         }
         if (m != n)
              printf_s("oh!\n");
         else
              printf_s("%.1lf\n", minsum*100);
}
int main()
{
        int T,C;
        G gg[105];
        cin >> T;
        while (T--) 

        {
                cin >> C;
                for (int i = 0; i < C; i++) 

                {
                        cin >> gg[i].x >> gg[i].y;
                }
                for
(int i = 0; i < C; i++) 

               {
                       for (int j = i; j < C; j++) 

                       {
                               double d = Distance(gg[i], gg[j]);
                               if(d<MIN&&d>0.0)     //将距离大于0.0且小于10.0的距离,赋一个大于1000.0的数
                               {
                                        map[i][j] = 2000.0;
                                        map[j][i] = 2000.0;
                               }
                               else
                               {
                                       map[i][j] = d;
                                       map[j][i] = d;
                               }
                       }
               }
               Prim(C);
        }
        return 0;
}

0 0