您的位置:首页 > 其它

【HDOJ】3832 Earth Hour

2015-10-26 15:22 381 查看
其实就是bfs,不过也可以写成最短路,因为权重为1,可以用Spira解。

/* 3832 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000")

#define sti                set<int>
#define stpii            set<pair<int, int> >
#define mpii            map<int,int>
#define vi                vector<int>
#define pii                pair<int,int>
#define vpii            vector<pair<int,int> >
#define rep(i, a, n)     for (int i=a;i<n;++i)
#define per(i, a, n)     for (int i=n-1;i>=a;--i)
#define clr                clear
#define pb                 push_back
#define mp                 make_pair
#define fir                first
#define sec                second
#define all(x)             (x).begin(),(x).end()
#define SZ(x)             ((int)(x).size())
#define lson            l, mid, rt<<1
#define rson            mid+1, r, rt<<1|1

const int maxn = 205;
const int maxe = maxn*maxn*2;
const int INF = 1e7;
int X[maxn], Y[maxn], R[maxn];
int dis[maxn], D[3][maxn];
bool inS[maxn];
int V[maxe], nxt[maxe];
int head[maxn], head_[maxn], n, m;

void addEdge(int u, int v) {
V[m] = v;
nxt[m] = head[u];
head[u] = m++;

V[m] = u;
nxt[m] = head[v];
head[v] = m++;
}

typedef struct node_t {
int u, v, w;

node_t() {}

node_t(int u_, int v_, int w_):
u(u_), v(v_), w(w_) {}

friend bool operator< (const node_t& a, const node_t& b) {
return a.w > b.w;
}
} node_t;

void forward(priority_queue<node_t>& Q, int u) {
int& k = head_[u];

if (k != -1) {
Q.push(node_t(u, V[k], dis[u]+1));
k = nxt[k];
}
}

void Spira(int s) {
priority_queue<node_t> Q;
node_t nd;
int cnt = 1;

memset(inS, false, sizeof(inS));
rep(i, 1, n+1)    dis[i] = INF;
dis[s] = 0;
inS[s] = true;
forward(Q, s);

while (!Q.empty()) {
nd = Q.top();
Q.pop();
forward(Q, nd.u);
if (!inS[nd.v]) {
inS[nd.v] = true;
dis[nd.v] = nd.w;
if (++cnt == n)
break;
forward(Q, nd.v);
}
}
}

int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif

int t;
int mn, ans;

scanf("%d", &t);
while (t--) {
scanf("%d", &n);
rep(i, 1, n+1)
scanf("%d %d %d", &X[i], &Y[i], &R[i]);
memset(head, -1, sizeof(head));
m = 0;
rep(i, 1, n+1) {
rep(j, 1, i) {
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])) {
addEdge(i, j);
}
}
}

memcpy(head_, head, sizeof(head));
Spira(1);
memcpy(D[0], dis, sizeof(dis));

memcpy(head_, head, sizeof(head));
Spira(2);
memcpy(D[1], dis, sizeof(dis));

memcpy(head_, head, sizeof(head));
Spira(3);
memcpy(D[2], dis, sizeof(dis));

mn = INF;
rep(i, 1, n+1)
mn = min(mn, D[0][i]+D[1][i]+D[2][i]);

ans = (mn==INF) ? -1:n-mn-1;
printf("%d\n", ans);
}

#ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: