http://acm.hdu.edu.cn/showproblem.php?pid=5934

题意:有N个炸弹,每个炸弹有一个坐标,一个爆炸范围和一个爆炸花费,如果一个炸弹的爆炸范围内有另外的炸弹,那么如果该炸弹爆炸,就会引爆所有爆炸范围内的炸弹,求让所有炸弹爆炸的最小花费。

思路:重现的时候来不及做。先n^2的把每个炸弹爆炸范围内的炸弹都连一条有向边,然后再找强连通分量缩点,这样会形成多个DAG,然后对于每个DAG找一个入度为0的点,找这个入度为0的点里面耗费最小的去引爆,就可以了。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cmath>
  4 #include <cstdlib>
  5 #include <algorithm>
  6 #include <string>
  7 #include <iostream>
  8 #include <stack>
  9 #include <map>
 10 #include <queue>
 11 using namespace std;
 12 #define N 1010
 13 #define INF 0x7fffffff
 14 struct node
 15 {
 16     int u, v, nxt;
 17 }edge[2000010];
 18 struct P
 19 {
 20     long long x, y, r, c;
 21 }p[N];
 22 int belong[N], vis[N], head[N], tot, cnt, num, dfn[N], low[N], in[N], out[N];
 23 stack<int> sta;
 24
 25 void init() {
 26     tot = cnt = num = 0;
 27     memset(dfn, 0, sizeof(dfn));
 28     memset(belong, 0, sizeof(belong));
 29     memset(vis, 0, sizeof(vis));
 30     memset(head, -1, sizeof(head));
 31     memset(in, 0, sizeof(in));
 32     memset(out, 0, sizeof(out));
 33     while(sta.size()) sta.pop();
 34 }
 35
 36 void add(int u, int v) {
 37     edge[tot].u = u; edge[tot].v = v; edge[tot].nxt = head[u]; head[u] = tot++;
 38 }
 39
 40 bool dis(int u, int v) {
 41     double a = sqrt(((p[u].x - p[v].x) * (p[u].x - p[v].x) + (p[u].y - p[v].y) * (p[u].y - p[v].y)) * 1.0);
 42     if(a <= p[u].r) return true;
 43     return false;
 44 }
 45
 46 void tarjan(int u) {
 47     vis[u] = 1;
 48     sta.push(u);
 49     dfn[u] = low[u] = ++cnt;
 50     for(int i = head[u]; ~i; i = edge[i].nxt) {
 51         int v = edge[i].v;
 52         if(!dfn[v]) {
 53             tarjan(v);
 54             if(low[v] < low[u]) low[u] = low[v];
 55         } else if(vis[v]) {
 56             if(dfn[v] < low[u]) low[u] = dfn[v];
 57         }
 58     }
 59     if(dfn[u] == low[u]) {
 60         ++num;
 61         while(true) {
 62             int v = sta.top(); sta.pop();
 63             belong[v] = num; vis[v] = 0;
 64             if(v == u) break;
 65         }
 66     }
 67 }
 68
 69 int main()
 70 {
 71     int t, cas = 1;
 72     scanf("%d", &t);
 73     while(t--) {
 74         int n;
 75         scanf("%d", &n);
 76         init();
 77         for(int i = 1; i <= n; i++) scanf("%I64d%I64d%I64d%I64d", &p[i].x, &p[i].y, &p[i].r, &p[i].c);
 78         for(int i = 1; i <= n; i++) {
 79             for(int j = 1; j <= n; j++) {
 80                 if(i == j) continue;
 81                 if(dis(i, j)) add(i, j);
 82             }
 83         }
 84         for(int i = 1; i <= n; i++) if(!dfn[i]) tarjan(i);
 85         for(int u = 1; u <= n; u++) {
 86             for(int i = head[u]; ~i; i = edge[i].nxt) {
 87                 int v = edge[i].v;
 88                 if(belong[u] != belong[v]) {
 89                     out[belong[u]]++;
 90                     in[belong[v]]++;
 91                 }
 92             }
 93         }
 94         long long ans = 0;
 95         for(int i = 1; i <= num; i++) {
 96             if(in[i] == 0) {
 97                 int mi = INF;
 98                 for(int j = 1; j <= n; j++) {
 99                     if(belong[j] == i) {
100                         if(p[j].c < mi) mi = p[j].c;
101                     }
102                 }
103                 ans += mi;
104             }
105         }
106         printf("Case #%d: %d\n", cas++, ans);
107     }
108     return 0;
109 }

转载于:https://www.cnblogs.com/fightfordream/p/6093256.html

HDU 5934:Bomb(强连通缩点)相关推荐

  1. HDU - 3594 Cactus (强连通缩点+STL)

    题目链接 题意:T组测试样例,每组样例给出一个N,表示(编号为0~N-1)的点有向图,随后给出这个有向图的边,每行是一个u和v,当u==0且v==0时边的输入结束.当每组两个条件时,输出YES,否则输 ...

  2. HDU - 4685 Prince and Princess(强连通缩点+二分图完备匹配)

    题目链接:点击查看 题目大意:给出n个王子和m个公主,每个王子都有喜欢的公主,题目需要我们在尽可能多的王子可以匹配到喜欢的公主的情况下,求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后, ...

  3. Poj 2186 Popular Cows(Tarjan 强连通缩点)

    传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...

  4. BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...

  5. 2019ICPC(银川) - Delivery Route(强连通缩点+分块最短路)

    题目链接:点击查看 题目大意:给出n个点和m条边构成的图,每条边都有权值,其中m1条边是双向的,且权值非负,有m2条边是单向的,且权值可负,现在要求从给定起点st到其他每个点的最短路,若不存在路径则输 ...

  6. POJ - 1904 King's Quest(强连通缩点)

    题目链接:点击查看 题目大意:给出n个王子和n个公主,每个王子都有喜欢的公主,每个王子初始时都娶到了一位喜欢的公主,题目需要我们求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后,其他的王 ...

  7. POJ - 1236 Network of Schools(强连通缩点)

    题目链接:点击查看 题目大意:一个学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校A支援学校B,并不表示学校B一定支援学校A).当某校获得一个新软件时,无论是 ...

  8. 有向图缩点:tarjan强连通缩点(模板)

    SCC强连通缩点:(用之前记得init) 可以将有向图转换为一个 DAG 图,然后进行拓扑 const int N=1e4+100;const int M=1e5+100;struct Egde {i ...

  9. 图论--SCC强连通缩点--Tarjan

    强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...

  10. HDU - 5934

    tarjan 视频讲解 /*** 题目链接:https://vjudge.net/problem/HDU-5934* 题意:给你n个炸弹,引爆每个炸弹会有一定的花费.每个炸弹给出坐标x,y,半径r,引 ...

最新文章

  1. Mysql使用大全 从基础到存储过程
  2. 重大事故!线上系统频繁卡死,凶手竟然是 Full GC ?
  3. SAP零售业解决方案
  4. 手机MMI体系结构及其实现
  5. 前端学习(2566):vue的生命周期
  6. Flowable 数据库表结构 ACT_RU_TASK
  7. vscode任务栏图标突然不显示
  8. 深度精简版XP如何安装IIS
  9. 关于computer vision的会议及vision guys-机器学习与视觉大牛族谱深度挖掘
  10. 分布电容对小信号的干扰解决方案
  11. Clipboard.js移动端【ios】复制事件不生效解决方法
  12. 35_pytorch 过拟合解决办法 (Early Stop, Dropout)
  13. oracle整理笔记
  14. 阿里集团CEO张勇:阿里培养领导者,看这2点
  15. 什么是 Azuki NFT 系列?
  16. python公里转海里_海里和公里怎么换算?
  17. 计算分子描述符——使用E-Dragon
  18. 【Python】一篇文章学会def定义函数的可选参数,默认参数,有默认值的可选参数(保姆级注释)
  19. android 小闹钟
  20. 2015上海网络赛 A Puzzled Elena

热门文章

  1. 文件怎么更新_安装累积更新丢文件似乎已成为惯例 KB4556799同样出现文件丢失问题...
  2. java通过+拼接字符串导致的无效SQL,三目运算符与+运算符结合使用时需要注意了
  3. HDU-3337 Guess the number 测试输入数据
  4. python技术路线_django开发网站的技术路线?
  5. 英文书: Python 网络编程基础手册
  6. 2017年高考改革地区:浙江、上海
  7. UnityShader之遮挡透明
  8. Apache MiNa 2 学习笔记
  9. (转)Managed DirectX +C# 开发(入门篇)(三)
  10. 自动化部署mysql主从复制集群_使用docker部署mysql主从复制集群