HDU 5934:Bomb(强连通缩点)
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(强连通缩点)相关推荐
- HDU - 3594 Cactus (强连通缩点+STL)
题目链接 题意:T组测试样例,每组样例给出一个N,表示(编号为0~N-1)的点有向图,随后给出这个有向图的边,每行是一个u和v,当u==0且v==0时边的输入结束.当每组两个条件时,输出YES,否则输 ...
- HDU - 4685 Prince and Princess(强连通缩点+二分图完备匹配)
题目链接:点击查看 题目大意:给出n个王子和m个公主,每个王子都有喜欢的公主,题目需要我们在尽可能多的王子可以匹配到喜欢的公主的情况下,求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后, ...
- Poj 2186 Popular Cows(Tarjan 强连通缩点)
传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...
- BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...
- 2019ICPC(银川) - Delivery Route(强连通缩点+分块最短路)
题目链接:点击查看 题目大意:给出n个点和m条边构成的图,每条边都有权值,其中m1条边是双向的,且权值非负,有m2条边是单向的,且权值可负,现在要求从给定起点st到其他每个点的最短路,若不存在路径则输 ...
- POJ - 1904 King's Quest(强连通缩点)
题目链接:点击查看 题目大意:给出n个王子和n个公主,每个王子都有喜欢的公主,每个王子初始时都娶到了一位喜欢的公主,题目需要我们求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后,其他的王 ...
- POJ - 1236 Network of Schools(强连通缩点)
题目链接:点击查看 题目大意:一个学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校A支援学校B,并不表示学校B一定支援学校A).当某校获得一个新软件时,无论是 ...
- 有向图缩点:tarjan强连通缩点(模板)
SCC强连通缩点:(用之前记得init) 可以将有向图转换为一个 DAG 图,然后进行拓扑 const int N=1e4+100;const int M=1e5+100;struct Egde {i ...
- 图论--SCC强连通缩点--Tarjan
强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...
- HDU - 5934
tarjan 视频讲解 /*** 题目链接:https://vjudge.net/problem/HDU-5934* 题意:给你n个炸弹,引爆每个炸弹会有一定的花费.每个炸弹给出坐标x,y,半径r,引 ...
最新文章
- Mysql使用大全 从基础到存储过程
- 重大事故!线上系统频繁卡死,凶手竟然是 Full GC ?
- SAP零售业解决方案
- 手机MMI体系结构及其实现
- 前端学习(2566):vue的生命周期
- Flowable 数据库表结构 ACT_RU_TASK
- vscode任务栏图标突然不显示
- 深度精简版XP如何安装IIS
- 关于computer vision的会议及vision guys-机器学习与视觉大牛族谱深度挖掘
- 分布电容对小信号的干扰解决方案
- Clipboard.js移动端【ios】复制事件不生效解决方法
- 35_pytorch 过拟合解决办法 (Early Stop, Dropout)
- oracle整理笔记
- 阿里集团CEO张勇:阿里培养领导者,看这2点
- 什么是 Azuki NFT 系列?
- python公里转海里_海里和公里怎么换算?
- 计算分子描述符——使用E-Dragon
- 【Python】一篇文章学会def定义函数的可选参数,默认参数,有默认值的可选参数(保姆级注释)
- android 小闹钟
- 2015上海网络赛 A Puzzled Elena
热门文章
- 文件怎么更新_安装累积更新丢文件似乎已成为惯例 KB4556799同样出现文件丢失问题...
- java通过+拼接字符串导致的无效SQL,三目运算符与+运算符结合使用时需要注意了
- HDU-3337 Guess the number 测试输入数据
- python技术路线_django开发网站的技术路线?
- 英文书: Python 网络编程基础手册
- 2017年高考改革地区:浙江、上海
- UnityShader之遮挡透明
- Apache MiNa 2 学习笔记
- (转)Managed DirectX +C# 开发(入门篇)(三)
- 自动化部署mysql主从复制集群_使用docker部署mysql主从复制集群