题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5934

题意:有n个炸弹,爆炸范围和点燃花费给你,如果一个爆炸那么它爆炸范围内的炸弹也会爆炸。问让所有炸弹爆炸的最小花费。

遍历任意两个炸弹,如果i在j的爆炸范围内,则建一条有向边。缩完点以后找入度为0的点点燃就行了。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long LL;
  5. typedef struct Edge {
  6. int u;
  7. int v;
  8. int next;
  9. Edge() { next = -; }
  10. }Edge;
  11. typedef struct P {
  12. LL x, y, r;
  13. int c;
  14. }P;
  15. const int maxn = ;
  16. P p[maxn];
  17.  
  18. int head[maxn], ecnt;
  19. Edge edge[maxn*maxn];
  20. int n, m;
  21.  
  22. int bcnt, dindex;
  23. int dfn[maxn], low[maxn];
  24. int stk[maxn], top;
  25. int belong[maxn];
  26. bool instk[maxn];
  27. int ret[maxn];
  28. int in[maxn];
  29.  
  30. void init() {
  31. memset(edge, , sizeof(edge));
  32. memset(head, -, sizeof(head));
  33. memset(instk, , sizeof(instk));
  34. memset(dfn, , sizeof(dfn));
  35. memset(low, , sizeof(low));
  36. memset(belong, , sizeof(belong));
  37. ecnt = top = bcnt = dindex = ;
  38. }
  39.  
  40. void adde(int uu, int vv) {
  41. edge[ecnt].u = uu;
  42. edge[ecnt].v = vv;
  43. edge[ecnt].next = head[uu];
  44. head[uu] = ecnt++;
  45. }
  46.  
  47. void tarjan(int u) {
  48. int v = u;
  49. dfn[u] = low[u] = ++dindex;
  50. stk[++top] = u;
  51. instk[u] = ;
  52. for(int i = head[u]; ~i; i=edge[i].next) {
  53. v = edge[i].v;
  54. if(!dfn[v]) {
  55. tarjan(v);
  56. low[u] = min(low[u], low[v]);
  57. }
  58. else if(instk[v]) low[u] = min(low[u], dfn[v]);
  59. }
  60. if(dfn[u] == low[u]) {
  61. bcnt++;
  62. do {
  63. v = stk[top--];
  64. instk[v] = ;
  65. belong[v] = bcnt;
  66. } while(v != u);
  67. }
  68. }
  69.  
  70. LL dis(P a, P b) {
  71. LL l1 = a.x - b.x;
  72. LL l2 = a.y - b.y;
  73. return l1 * l1 + l2 * l2;
  74. }
  75.  
  76. int main() {
  77. // freopen("in", "r", stdin);
  78. int T, _ = ;
  79. scanf("%d", &T);
  80. while(T--) {
  81. scanf("%d", &n);
  82. init();
  83. memset(in, , sizeof(in));
  84. for(int i = ; i <= n; i++) ret[i] = ;
  85. for(int i = ; i <= n; i++) {
  86. scanf("%I64d%I64d%I64d%d",&p[i].x,&p[i].y,&p[i].r,&p[i].c);
  87. }
  88. for(int i = ; i <= n; i++) {
  89. for(int j = ; j <= n; j++) {
  90. if(i == j) continue;
  91. LL d = dis(p[i], p[j]);
  92. if(d <= (LL)p[i].r * p[i].r) adde(i, j);
  93. }
  94. }
  95. for(int i = ; i <= n; i++) {
  96. if(!dfn[i]) tarjan(i);
  97. }
  98. for(int i = ; i < ecnt; i++) {
  99. int u = edge[i].u, v = edge[i].v;
  100. if(belong[u] != belong[v]) in[belong[v]]++;
  101. }
  102. for(int i = ; i <= n; i++) {
  103. ret[belong[i]] = min(ret[belong[i]], p[i].c);
  104. }
  105. int tot = ;
  106. for(int i = ; i <= bcnt; i++) {
  107. if(!in[i]) tot += ret[i];
  108. }
  109. printf("Case #%d: ", _++);
  110. printf("%d\n", tot);
  111. }
  112. return ;
  113. }

[HDOJ5934]Bomb(强连通分量,缩点)的更多相关文章

  1. POJ1236Network of Schools[强连通分量|缩点]

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16571   Accepted: 65 ...

  2. POJ1236Network of Schools(强连通分量 + 缩点)

    题目链接Network of Schools 参考斌神博客 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后 ...

  3. HD2767Proving Equivalences(有向图强连通分量+缩点)

    题目链接 题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的 分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG.接下来,设有a个节点(每个节点对应 ...

  4. UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)

    题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...

  5. ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)

    题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...

  6. POJ2553 The Bottom of a Graph(强连通分量+缩点)

    题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v). 把图的强连通分量缩点,那么答案显然就是所有出度为0的点. 用Tarjan找强连通分量: #include<cstdio&g ...

  7. uva 11324 The Largest Clique(强连通分量缩点+DAG动态规划)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...

  8. poj 2762 Going from u to v or from v to u?(强连通分量+缩点重构图+拓扑排序)

    http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit:  ...

  9. tarjan算法(强连通分量 + 强连通分量缩点 + 桥(割边) + 割点 + LCA)

    这篇文章是从网络上总结各方经验 以及 自己找的一些例题的算法模板,主要是用于自己的日后的模板总结以后防失忆常看看的, 写的也是自己能看懂即可. tarjan算法的功能很强大, 可以用来求解强连通分量, ...

  10. LA 4287 等价性证明(强连通分量缩点)

    https://vjudge.net/problem/UVALive-4287 题意: 给出n个结点m条边的有向图,要求加尽量少的边,使得新图强连通. 思路:强连通分量缩点,然后统计缩点后的图的每个结 ...

随机推荐

  1. Yii2下拉框实现

    详细介绍yii2下拉框的实现方法,以商品分类的下拉框为例: 第一种方法:使用Html的activeDropDownList(),该方法的优点是:可以自定义下拉框的样式.具体实现如下: 1.控制器中,获 ...

  2. imread函数、namedWindow函数、imshow函数、imwrite函数

    1.imread函数 首先,我们看imread函数,可以在OpenCV官方文档中查到其原型如下: Mat imread(const string& filename, int flags=1 ...

  3. PL/SQL编程基础

    范例:编写不做任何工作的PL/SQL块 BEGIN NULL ; END ; /   范例:编写一个简单的PL/SQL程序 DECLARE v_num NUMBER ; -- 定义一个变量v_num ...

  4. sql创建删除修改表的基本操作

    1 建立表格 在建立好数据库以后,就可以根据储存资料的需求,使用SQL叙述建立所有需要的表格(table).建立表格的设定非常多,以建立"world.city"表格来说,它的叙述会 ...

  5. Android NDK 开发(三)--常见错误锦集合Log的使用【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误, ...

  6. java网络编程之UDP通讯

    详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...

  7. Linux自动删除n天前备份

    Linux是一个很能自动产生文件的系统,日志.邮件.备份等.因此需要设置让系统定时清理一些不需要的文件. 语句写法: find 对应目录 -mtime +天数 -name "文件名" ...

  8. 利用python进行数据分析 (学习笔记)

    第一章:准备工作 1.重要的Python库 (1)NumPy:Python科学计算的基础包.功能有:

  9. 完整学习git五git重置

    git重置命令的一个用途就是修改引用的游标指向 1查看git操作日志 git reflog 2查看当前head游标的指向 cat .git/refs/heads/master 3重置和跳转 git r ...

  10. App store 如何使用 promo code | app store 打不开精品推荐和排行榜

    1. app store 如何使用 promo code: 在app store的 右下角精品推荐标签页,拉到最下面 点击“兑换” ,跳转到新的页面,输入兑换码,然后右上角“兑换”,程序开始自动下载并 ...