Bomb

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1853    Accepted Submission(s): 608

Problem Description
There are N bombs needing exploding.

Each bomb has three attributes: exploding radius ri, position (xi,yi) and lighting-cost ci which means you need to pay ci cost making it explode.

If a un-lighting bomb is in or on the border the exploding area of another exploding one, the un-lighting bomb also will explode.

Now you know the attributes of all bombs, please use the minimum cost to explode all bombs.

 
Input
First line contains an integer T, which indicates the number of test cases.

Every test case begins with an integers N, which indicates the numbers of bombs.

In the following N lines, the ith line contains four intergers xi, yi, ri and ci, indicating the coordinate of ith bomb is (xi,yi), exploding radius is ri and lighting-cost is ci.

Limits
- 1≤T≤20
- 1≤N≤1000
- −108≤xi,yi,ri≤108
- 1≤ci≤104

 
Output
For every test case, you should output 'Case #x: y', where x indicates the case number and counts from 1 and y is the minimum cost.
 
Sample Input
1
5
0 0 1 5
1 1 1 6
0 1 1 7
3 0 2 10
5 0 1 4
 
Sample Output
Case #1: 15
 
Source

思路:将给出的点之间连边,对每个强联通分量去最小值即可。

代码:

 ```C++
#include<bits/stdc++.h>
//#include<regex>
#define db double
#include<vector>
#define ll long long
#define vec vector<ll>
#define Mt vector<vec>
#define ci(x) scanf("%d",&x)
#define cd(x) scanf("%lf",&x)
#define cl(x) scanf("%lld",&x)
#define pi(x) printf("%d\n",x)
#define pd(x) printf("%f\n",x)
#define pl(x) printf("%lld\n",x)
#define MP make_pair
#define PB push_back
#define inf 0x3f3f3f3f3f3f3f3f
#define fr(i, a, b) for(int i=a;i<=b;i++)
const int N = 4e6 + ;
const int mod = 1e9 + ;
const int MOD = mod - ;
const db eps = 1e-;
const db PI = acos(-1.0);
using namespace std;
struct P {
int f, to, nxt;
} e[N]; struct PP {
int x, y, r, c;
} a[N];
int hea[];
int n, cnt, sig, tt, cont;
int deg[], sta[], col[], vis[], low[], dfn[], need[], contz[]; void add(int f, int to) {//建边
e[cont].to = to;
e[cont].f = f;
e[cont].nxt = hea[f];
hea[f] = cont++;
} void tarjan(int u) {//强联通分量
vis[u] = ;
low[u] = dfn[u] = cnt++;
sta[++tt] = u;
for (int i = hea[u]; i != -; i = e[i].nxt) {
int v = e[i].to;
if (vis[v] == ) tarjan(v);
if (vis[v] == ) low[u] = min(low[u], low[v]);
}
if (dfn[u] == low[u]) {
sig++;
do {
col[sta[tt]] = sig;
vis[sta[tt]] = -;
} while (sta[tt--] != u);
}
} void cal() {
cnt = ;
sig = ;
tt = -;
memset(dfn, , sizeof(dfn));memset(col, , sizeof(col));memset(vis, , sizeof(vis));
memset(sta, , sizeof(sta));memset(low, , sizeof(low));memset(deg, , sizeof(deg));
memset(contz, 0x3f3f3f3f, sizeof(contz));
for (int i = ; i < n; i++) if (!vis[i]) tarjan(i);
for (int i = ; i < cont; i++) {
int u = e[i].f;
int v = e[i].to;
if (col[u] != col[v]) deg[col[v]]++;
}
for (int i = ; i < n; i++) if (!deg[col[i]]) contz[col[i]] = min(contz[col[i]], a[i].c);
int ans = ; for (int i = ; i <= sig; i++) if (!deg[i]) ans += contz[i];
pi(ans);
} int main() {
int t;
ci(t);
for (int ii = ; ii <= t; ii++) {
ci(n);
for (int i = ; i < n; i++) scanf("%d%d%d%d", &a[i].x, &a[i].y, &a[i].r, &a[i].c);
cont = ;
memset(hea, -, sizeof(hea));
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
ll tmp = a[i].x - a[j].x;
ll tmp2 = a[i].y - a[j].y;
ll d1 = tmp * tmp + tmp2 * tmp2;
ll d2 = 1ll * a[i].r * a[i].r;
if (d1 <= d2) add(i, j);
}
}
printf("Case #%d: ", ii);
cal();
}
return ;
} ```
 #include<bits/stdc++.h>
//#include<regex>
#define db double
#include<vector>
#define ll long long
#define vec vector<ll>
#define Mt vector<vec>
#define ci(x) scanf("%d",&x)
#define cd(x) scanf("%lf",&x)
#define cl(x) scanf("%lld",&x)
#define pi(x) printf("%d\n",x)
#define pd(x) printf("%f\n",x)
#define pl(x) printf("%lld\n",x)
#define MP make_pair
#define PB push_back
#define inf 0x3f3f3f3f3f3f3f3f
#define fr(i, a, b) for(int i=a;i<=b;i++)
const int N = 4e6 + ;
const int mod = 1e9 + ;
const int MOD = mod - ;
const db eps = 1e-;
const db PI = acos(-1.0);
using namespace std;
struct P {
int f, to, nxt;
} e[N]; struct PP {
int x, y, r, c;
} a[N];
int hea[];
int n, cnt, sig, tt, cont;
int deg[], sta[], col[], vis[], low[], dfn[], need[], contz[]; void add(int f, int to) {//建边
e[cont].to = to;
e[cont].f = f;
e[cont].nxt = hea[f];
hea[f] = cont++;
} void tarjan(int u) {//强联通分量
vis[u] = ;
low[u] = dfn[u] = cnt++;
sta[++tt] = u;
for (int i = hea[u]; i != -; i = e[i].nxt) {
int v = e[i].to;
if (vis[v] == ) tarjan(v);
if (vis[v] == ) low[u] = min(low[u], low[v]);
}
if (dfn[u] == low[u]) {
sig++;
do {
col[sta[tt]] = sig;
vis[sta[tt]] = -;
} while (sta[tt--] != u);
}
} void cal() {
cnt = ;
sig = ;
tt = -;
memset(dfn, , sizeof(dfn));memset(col, , sizeof(col));memset(vis, , sizeof(vis));
memset(sta, , sizeof(sta));memset(low, , sizeof(low));memset(deg, , sizeof(deg));
memset(contz, 0x3f3f3f3f, sizeof(contz));
for (int i = ; i < n; i++) if (!vis[i]) tarjan(i);
for (int i = ; i < cont; i++) {
int u = e[i].f;
int v = e[i].to;
if (col[u] != col[v]) deg[col[v]]++;
}
for (int i = ; i < n; i++) if (!deg[col[i]]) contz[col[i]] = min(contz[col[i]], a[i].c);
int ans = ; for (int i = ; i <= sig; i++) if (!deg[i]) ans += contz[i];
pi(ans);
} int main() {
int t;
ci(t);
for (int ii = ; ii <= t; ii++) {
ci(n);
for (int i = ; i < n; i++) scanf("%d%d%d%d", &a[i].x, &a[i].y, &a[i].r, &a[i].c);
cont = ;
memset(hea, -, sizeof(hea));
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
ll tmp = a[i].x - a[j].x;
ll tmp2 = a[i].y - a[j].y;
ll d1 = tmp * tmp + tmp2 * tmp2;
ll d2 = 1ll * a[i].r * a[i].r;
if (d1 <= d2) add(i, j);
}
}
printf("Case #%d: ", ii);
cal();
}
return ;
}

HDU 5934 强联通分量的更多相关文章

  1. HDU 5934 (强连同分量+缩点)

    题意: 给出n个炸弹的信息 :坐标x , 坐标y , 爆炸半径 , 成本: 如果一个炸弹被引爆那这个范围的都爆炸 , 问最小的成本是多少? 题意:首先先来个n^2 暴力出某个炸弹爆炸波及的其他炸弹,用 ...

  2. hdu 1269 (强联通分量Tarjan入门)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. HDU 1269 迷宫城堡 【强联通分量(模版题)】

    知识讲解: 在代码里我们是围绕 low 和 dfn 来进行DFS,所以我们务必明白 low 和 dfn 是干什么的? 有什么用,这样才能掌握他.   1.  dfn[]  遍历到这个点的时间 2.   ...

  4. HDU 4685 Prince and Princess(二分匹配+强联通分量)

    题意:婚配问题,但是题目并不要求输出最大匹配值,而是让我们输出,一个王子可以与哪些王妃婚配而不影响最大匹配值. 解决办法:先求一次最大匹配,如果有两个已经匹配的王妃,喜欢她们两个的有两个或者以上相同的 ...

  5. 【强联通图 | 强联通分量】HDU 1269 迷宫城堡 【Kosaraju或Tarjan算法】

      为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明 ...

  6. Kosaraju算法---强联通分量

    1.基础知识 所需结构:原图.反向图(若在原图中存在vi到vj有向边,在反向图中就变为vj到vi的有向边).标记数组(标记是否遍历过).一个栈(或记录顶点离开时间的数组).      算法描叙: :对 ...

  7. [CF #236 (Div. 2) E] Strictly Positive Matrix(强联通分量)

    题目:http://codeforces.com/contest/402/problem/E 题意:给你一个矩阵a,判断是否存在k,使得a^k这个矩阵全部元素都大于0 分析:把矩阵当作01矩阵,超过1 ...

  8. UVa 11324 & 强联通分量+DP

    题意: 一张无向图,求点集使其中任意两点可到达. SOL: 强联通分量中的点要么不选要么全都选,然后缩点DAG+DP 记录一下思路,不想写了...代码满天飞.

  9. BZOJ 1051 & 强联通分量

    题意: 怎么说呢...这种题目有点概括不来....还是到原题面上看好了... SOL: 求出强联通分量然后根据分量重构图,如果只有一个点没有出边那么就输出这个点中点的数目. 对就是这样. 哦还有论边双 ...

随机推荐

  1. 学习之-ASP.NET MVC Filter

    MVC Filter 是典型的AOP应用,对MVC框架处理客户端请求注入额外的一些逻辑,如日志记录.缓存处理.异常处理和权限验证,性能检测(横切关注点),而这些逻辑通常与主要业务无关,被独立分开作为公 ...

  2. 201521123090 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代 ...

  3. 201521123072《Java程序设计》第6周学习总结

    201521123072<Java程序设计>第6周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画 ...

  4. 在Ubuntu中部署并测试Fabric 1.0 Beta

    [更新:1.0Beta已经是过去式了,现在出了1.0.0的正式版,请大家参照 http://www.cnblogs.com/studyzy/p/7437157.html  安装Fabric 1.0.0 ...

  5. java.lang.RuntimeException: java.sql.SQLException: Too many parameters: expected 0, was given 1 Quer

    如果出现类似这样的错误,检查一下是否sql语句和参数的位置对调了. java.lang.RuntimeException: java.sql.SQLException: Too many parame ...

  6. DOM【介绍、HTML中的DOM、XML中的DOM】

    什么是DOM? DOM(Document Object Model)文档对象模型,是语言和平台的中立接口. 允许程序和脚本动态地访问和更新文档的内容. 为什么要使用DOM? Dom技术使得用户页面可以 ...

  7. JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】

    什么是EL表达式? 表达式语言(Expression Language,EL),EL表达式是用"${}"括起来的脚本,用来更方便的读取对象! EL表达式主要用来读取数据,进行内容的 ...

  8. Struts2第十二篇【模型驱动】

    什么是模型驱动 在Struts2中模型驱动就是用来封装数据的..完成数据的自动封装. 为什么要使用模型驱动? 我们之前就使用过Sturts2的数据自动封装功能,是用params拦截器完成的-既然有了p ...

  9. linux加载与使用ko驱动

    linux驱动和有两种形式: 1:编译到内核 2:编译为ko模块 这里记录下ko模块使用方法. 首先cd到/var/lib/(内核版本)/drivers/ 在这里面找到要装载的模块ko文件 modpr ...

  10. arm-linux-gcc 4.3.2编译uboot 1.1.6

    在第三期项目的视频中,官方提供了一整套新的工具链,bootloader, 内核和文件系统(arm-linux-gcc_4.3.2, uboot-2012.04.01, linux-3.4.2)其中ub ...