• POJ 2031 Building a Space Station


    题目链接:https://vjudge.net/problem/POJ-2031

    题目大意

       给定 N 个空间站,每个空间站都有自己的三维坐标和半径,任意两个空间站都互相可达,如果两个空间接触或者有重叠,则记为无走廊可达;反之就是有走廊可达,问为了使空间站两两可达,最短需要修建的走廊长度为多少。

    分析

      同 POJ 1789。

    代码如下

      1 #include <cmath>
      2 #include <ctime>
      3 #include <iostream>
      4 #include <string>
      5 #include <vector>
      6 #include <cstdio>
      7 #include <cstdlib>
      8 #include <cstring>
      9 #include <queue>
     10 #include <map>
     11 #include <set>
     12 #include <algorithm>
     13 #include <cctype>
     14 #include <stack>
     15 #include <deque>
     16 #include <list>
     17 #include <sstream>
     18 #include <cassert>
     19 using namespace std;
     20  
     21 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
     22 #define Rep(i,n) for (int i = 0; i < (n); ++i)
     23 #define For(i,s,t) for (int i = (s); i <= (t); ++i)
     24 #define rFor(i,t,s) for (int i = (t); i >= (s); --i)
     25 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
     26 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
     27 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
     28 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
     29  
     30 #define pr(x) cout << #x << " = " << x << "  "
     31 #define prln(x) cout << #x << " = " << x << endl
     32  
     33 #define LOWBIT(x) ((x)&(-x))
     34  
     35 #define ALL(x) x.begin(),x.end()
     36 #define INS(x) inserter(x,x.begin())
     37 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end())
     38 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c 
     39 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower);
     40 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper);
     41  
     42 #define ms0(a) memset(a,0,sizeof(a))
     43 #define msI(a) memset(a,0x3f,sizeof(a))
     44 #define msM(a) memset(a,-1,sizeof(a))
     45 
     46 #define MP make_pair
     47 #define PB push_back
     48 #define ft first
     49 #define sd second
     50  
     51 template<typename T1, typename T2>
     52 istream &operator>>(istream &in, pair<T1, T2> &p) {
     53     in >> p.first >> p.second;
     54     return in;
     55 }
     56  
     57 template<typename T>
     58 istream &operator>>(istream &in, vector<T> &v) {
     59     for (auto &x: v)
     60         in >> x;
     61     return in;
     62 }
     63  
     64 template<typename T1, typename T2>
     65 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
     66     out << "[" << p.first << ", " << p.second << "]" << "
    ";
     67     return out;
     68 }
     69 
     70 inline int gc(){
     71     static const int BUF = 1e7;
     72     static char buf[BUF], *bg = buf + BUF, *ed = bg;
     73     
     74     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
     75     return *bg++;
     76 } 
     77 
     78 inline int ri(){
     79     int x = 0, f = 1, c = gc();
     80     for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
     81     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
     82     return x*f;
     83 }
     84 
     85 template<class T>
     86 inline string toString(T x) {
     87     ostringstream sout;
     88     sout << x;
     89     return sout.str();
     90 }
     91 
     92 inline int toInt(string s) {
     93     int v;
     94     istringstream sin(s);
     95     sin >> v;
     96     return v;
     97 }
     98 
     99 //min <= aim <= max
    100 template<typename T>
    101 inline bool BETWEEN(const T aim, const T min, const T max) {
    102     return min <= aim && aim <= max;
    103 }
    104  
    105 typedef long long LL;
    106 typedef unsigned long long uLL;
    107 typedef pair< double, double > PDD;
    108 typedef pair< int, int > PII;
    109 typedef pair< int, PII > PIPII;
    110 typedef pair< string, int > PSI;
    111 typedef pair< int, PSI > PIPSI;
    112 typedef set< int > SI;
    113 typedef set< PII > SPII;
    114 typedef vector< int > VI;
    115 typedef vector< double > VD;
    116 typedef vector< VI > VVI;
    117 typedef vector< SI > VSI;
    118 typedef vector< PII > VPII;
    119 typedef map< int, int > MII;
    120 typedef map< LL, int > MLLI;
    121 typedef map< int, string > MIS;
    122 typedef map< int, PII > MIPII;
    123 typedef map< PII, int > MPIII;
    124 typedef map< string, int > MSI;
    125 typedef map< string, string > MSS;
    126 typedef map< PII, string > MPIIS;
    127 typedef map< PII, PII > MPIIPII;
    128 typedef multimap< int, int > MMII;
    129 typedef multimap< string, int > MMSI;
    130 //typedef unordered_map< int, int > uMII;
    131 typedef pair< LL, LL > PLL;
    132 typedef vector< LL > VL;
    133 typedef vector< VL > VVL;
    134 typedef priority_queue< int > PQIMax;
    135 typedef priority_queue< int, VI, greater< int > > PQIMin;
    136 const double EPS = 1e-8;
    137 const LL inf = 0x3fffffff;
    138 const LL infLL = 0x3fffffffffffffffLL;
    139 const LL mod = 1e9 + 7;
    140 const int maxN = 1e2 + 7;
    141 const LL ONE = 1;
    142 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
    143 const LL oddBits = 0x5555555555555555;
    144 
    145 struct Cell{
    146     double x, y, z, r;
    147 };
    148 
    149 istream& operator>> (istream& in, Cell &x) {
    150     in >> x.x >> x.y >> x.z >> x.r;
    151     return in;
    152 }
    153 
    154 int sgn(double x) {
    155     if(fabs(x) < EPS) return 0;
    156     return x > 0 ? 1 : -1;
    157 }
    158 
    159 int N;
    160 double ans;
    161 double adj[maxN][maxN], dist[maxN];
    162 Cell cells[maxN];
    163 bool vis[maxN];
    164 
    165 void Prim(int S) {
    166     ms0(vis);
    167     vis[S] = 1;
    168     For(i, 1, N) dist[i] = adj[S][i];
    169     
    170     Rep(cnt, N - 1) {
    171         int index;
    172         double minW = inf;
    173         
    174         For(i, 1, N) {
    175             if(!vis[i] && sgn(minW - dist[i]) > 0) {
    176                 index = i;
    177                 minW = dist[i];
    178             }
    179         }
    180         
    181         ans += minW;
    182         vis[index] = 1;
    183         
    184         For(i, 1, N) if(!vis[i] && sgn(dist[i] - adj[index][i]) > 0) dist[i] = adj[index][i];
    185     }
    186 }
    187 
    188 int main(){
    189     //freopen("MyOutput.txt","w",stdout);
    190     //freopen("input.txt","r",stdin);
    191     //INIT();
    192     while(cin >> N && N) {
    193         ans = 0;
    194         For(i, 1, N) cin >> cells[i];
    195         For(i, 1, N) {
    196             For(j, i + 1, N) {
    197                 double x = cells[i].x - cells[j].x;
    198                 double y = cells[i].y - cells[j].y;
    199                 double z = cells[i].z - cells[j].z;
    200                 double d = sqrt(x * x + y * y + z * z);
    201                 d -= cells[i].r + cells[j].r;
    202                 if(sgn(d) <= 0) d = 0;
    203                 
    204                 adj[i][j] = adj[j][i] = d;
    205             }
    206         }
    207         
    208         Prim(1);
    209         
    210         printf("%.3f
    ", ans + EPS);
    211     }
    212     return 0;
    213 }
    View Code
  • 相关阅读:
    第36课 经典问题解析三
    第35课 函数对象分析
    67. Add Binary
    66. Plus One
    58. Length of Last Word
    53. Maximum Subarray
    38. Count and Say
    35. Search Insert Position
    28. Implement strStr()
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/11303946.html
Copyright © 2020-2023  润新知