【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; }
相关文章推荐
- 基于zookeeper和quartz实现分布式定时调度
- Log日志规范(转)
- mysql 索引
- memcached-session-manager 配置问题
- C#正则表达式之Regex类用法详解
- 阿里云Centos配置LNMP环境
- uva 116 Unidirectional (单向)TSP
- Java 字符终端上获取输入 System.in
- C 缓冲区
- 1031. Hello World for U
- 中文分词基本算法介绍
- STM32F4xx时钟理解
- 聊聊Android中的WebView控件
- 基本命令
- 1.8 Zero Matrix
- JS判断客户端是否是iOS或者Android包括浏览器类型判断
- Android 绘制虚线
- 从零开始nodejs系列文章
- SLAM: SLAM系统研究点-摘要
- Application类