• 【HDOJ】3832 Earth Hour


    其实就是bfs,不过也可以写成最短路,因为权重为1,可以用Spira解。

      1 /* 3832 */
      2 #include <iostream>
      3 #include <string>
      4 #include <map>
      5 #include <queue>
      6 #include <set>
      7 #include <stack>
      8 #include <vector>
      9 #include <deque>
     10 #include <algorithm>
     11 #include <cstdio>
     12 #include <cmath>
     13 #include <ctime>
     14 #include <cstring>
     15 #include <climits>
     16 #include <cctype>
     17 #include <cassert>
     18 #include <functional>
     19 #include <iterator>
     20 #include <iomanip>
     21 using namespace std;
     22 //#pragma comment(linker,"/STACK:102400000,1024000")
     23 
     24 #define sti                set<int>
     25 #define stpii            set<pair<int, int> >
     26 #define mpii            map<int,int>
     27 #define vi                vector<int>
     28 #define pii                pair<int,int>
     29 #define vpii            vector<pair<int,int> >
     30 #define rep(i, a, n)     for (int i=a;i<n;++i)
     31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
     32 #define clr                clear
     33 #define pb                 push_back
     34 #define mp                 make_pair
     35 #define fir                first
     36 #define sec                second
     37 #define all(x)             (x).begin(),(x).end()
     38 #define SZ(x)             ((int)(x).size())
     39 #define lson            l, mid, rt<<1
     40 #define rson            mid+1, r, rt<<1|1
     41 
     42 const int maxn = 205;
     43 const int maxe = maxn*maxn*2;
     44 const int INF = 1e7;
     45 int X[maxn], Y[maxn], R[maxn];
     46 int dis[maxn], D[3][maxn];
     47 bool inS[maxn];
     48 int V[maxe], nxt[maxe];
     49 int head[maxn], head_[maxn], n, m;
     50 
     51 void addEdge(int u, int v) {
     52     V[m] = v;
     53     nxt[m] = head[u];
     54     head[u] = m++;
     55     
     56     V[m] = u;
     57     nxt[m] = head[v];
     58     head[v] = m++;
     59 }
     60 
     61 typedef struct node_t {
     62     int u, v, w;
     63     
     64     node_t() {}
     65     
     66     node_t(int u_, int v_, int w_):
     67         u(u_), v(v_), w(w_) {}
     68         
     69     friend bool operator< (const node_t& a, const node_t& b) {
     70         return a.w > b.w;
     71     }
     72 } node_t;
     73 
     74 void forward(priority_queue<node_t>& Q, int u) {
     75     int& k = head_[u];
     76     
     77     if (k != -1) {
     78         Q.push(node_t(u, V[k], dis[u]+1));
     79         k = nxt[k];
     80     }
     81 }
     82 
     83 void Spira(int s) {
     84     priority_queue<node_t> Q;
     85     node_t nd;
     86     int cnt = 1;
     87     
     88     memset(inS, false, sizeof(inS));
     89     rep(i, 1, n+1)    dis[i] = INF;
     90     dis[s] = 0;
     91     inS[s] = true;
     92     forward(Q, s);
     93     
     94     while (!Q.empty()) {
     95         nd = Q.top();
     96         Q.pop();
     97         forward(Q, nd.u);
     98         if (!inS[nd.v]) {
     99             inS[nd.v] = true;
    100             dis[nd.v] = nd.w;
    101             if (++cnt == n)
    102                 break;
    103             forward(Q, nd.v);
    104         }
    105     }
    106 }
    107 
    108 int main() {
    109     ios::sync_with_stdio(false);
    110     #ifndef ONLINE_JUDGE
    111         freopen("data.in", "r", stdin);
    112         freopen("data.out", "w", stdout);
    113     #endif
    114     
    115     int t;
    116     int mn, ans;
    117     
    118     scanf("%d", &t);
    119     while (t--) {
    120         scanf("%d", &n);
    121         rep(i, 1, n+1)
    122             scanf("%d %d %d", &X[i], &Y[i], &R[i]);
    123         memset(head, -1, sizeof(head));
    124         m = 0;
    125         rep(i, 1, n+1) {
    126             rep(j, 1, i) {
    127                 if ((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]) <= (R[i]+R[j])*(R[i]+R[j])) {
    128                     addEdge(i, j);
    129                 }
    130             }
    131         }
    132         
    133         memcpy(head_, head, sizeof(head));
    134         Spira(1);
    135         memcpy(D[0], dis, sizeof(dis));
    136         
    137         memcpy(head_, head, sizeof(head));
    138         Spira(2);
    139         memcpy(D[1], dis, sizeof(dis));
    140         
    141         memcpy(head_, head, sizeof(head));
    142         Spira(3);
    143         memcpy(D[2], dis, sizeof(dis));
    144         
    145         mn = INF;
    146         rep(i, 1, n+1)
    147             mn = min(mn, D[0][i]+D[1][i]+D[2][i]);
    148             
    149         ans = (mn==INF) ? -1:n-mn-1;
    150         printf("%d
    ", ans);
    151     }
    152     
    153     #ifndef ONLINE_JUDGE
    154         printf("time = %d.
    ", (int)clock());
    155     #endif
    156     
    157     return 0;
    158 }
  • 相关阅读:
    (转)老话题,权限设计及实现!
    (转)深入理解最强桌面地图控件GMAP.NET 百度地图
    (转)一步一步Asp.Net MVC系列_权限管理设计起始篇
    (转)常见存储过程分页PK赛——简单测试分析常见存储过程分页速度
    (转)正则表达之零宽断言(零宽度正预测先行断言)
    holer实现外网访问本地网站
    ural(Timus) 1039. Anniversary Party
    uva 10308 Roads in the North
    其他OJ 树型DP 技能树(未通过)
    ural(Timus) 1067. Disk Tree
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4911328.html
Copyright © 2020-2023  润新知