题目大意:

给定n个爆破点的信息 x y r w

表示爆破点位置为 (x,y) 爆破范围是以位置为圆心 半径为r的圆 引爆这个点的代价为w

引爆某个点时 其他位置在该爆破范围内的爆破点也会被引爆

求引爆所有爆破点的最小的爆破代价

这道题跟 上一篇的 OJ 22833(POJ 2186) 差不多

那题是缩点再计算出度 这题是缩点再计算入度

以爆破关系建图 即若引爆 i 点能使 j 点被引爆 那么连一条 i 到 j 的边

若存在点 k 的位置被包含在点 j 的爆破范围内,点 j 的位置被包含在点 i 的爆破范围内,但点 k 的位置不被包含在点 i 的爆破范围内

此时若引爆 i 点 那么 j 点会被引爆,而 j 点被引爆 k 点也会被引爆,即爆破存在传递性

所以求完这个图的强联通分量并缩点后 此时引爆这个图的里一个强联通分量

那么这个强联通分量能到达的其他强联通分量也会被引爆

又因为一个强联通分量内任意两点能互达 所以引爆一个强联通分量只需要引爆它内部的其中一个点

那么引爆一个强联通分量 应该贪心地选择它内部爆破代价最小的那个点

所以此时需要引爆的就是那些 入度为0的强联通分量内爆破代价最小的点 (由它们开始发生连环引爆)(图内的独立点入度也为0)

#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <stack>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std; const int N=;
struct EDGE { int to, nt; }e[N*N];
int head[N], tot;
int dfn[N], low[N], ind;
int col[N], id;
bool vis[N];
stack <int> s; int n, m, du[N];
LL x[N], y[N], r[N];
LL w[N], val[N]; void init() {
while(!s.empty()) s.pop();
for(int i=;i<=n;i++) {
head[i]=dfn[i]=low[i]=col[i]=-;
vis[i]=du[i]=; val[i]=INF;
}
tot=ind=id=;
}
void addE(int u,int v) {
e[tot].to=v;
e[tot].nt=head[u];
head[u]=tot++;
} void tarjan(int u) {
dfn[u]=low[u]=ind++;
s.push(u); vis[u]=;
for(int i=head[u];i!=-;i=e[i].nt) {
int v=e[i].to;
if(dfn[v]==-) {
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],low[v]);
}
if(dfn[u]==low[u]) {
col[u]=++id;
vis[u]=;
while(s.top()!=u) {
col[s.top()]=id;
vis[s.top()]=;
s.pop();
} s.pop();
}
} bool uni(int i,int j) {
LL dis=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
if(dis<=r[i]*r[i]) return ;
return ;
} int main()
{
int t, tcase=;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld%lld%lld%lld",&x[i],&y[i],&r[i],&w[i]);
init();
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++) {
if(uni(i,j)) addE(i,j); // j在i的爆破范围内 连i->j
if(uni(j,i)) addE(j,i); // i在j的爆破范围内 连j->i
} for(int i=;i<=n;i++)
if(dfn[i]==-) tarjan(i); for(int i=;i<=n;i++) {
val[col[i]]=min(val[col[i]],w[i]);
// 颜色相同说明在同个强联通分量内
// 保存这个强联通分量内爆破代价最小的点
for(int j=head[i];j!=-;j=e[j].nt)
if(col[e[j].to]!=col[i])
du[col[e[j].to]]++; // 计算各个强联通分量的入度
} LL ans=0LL;
for(int i=;i<=id;i++)
if(du[i]==) ans+=val[i]; // 入度为0 引爆
printf("Case #%d: %lld\n",++tcase,ans);
} return ;
}

2016CCPC杭州现场赛 B-Bomb /// tarjan缩点的更多相关文章

  1. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  2. CCPC2016杭州现场赛

    A(hdu5933):(贪心) 题意:长度为n的数组: a1, a2,⋯, 每次操作要么可以merge两个相邻的数为一个, 值为两个数的和; 要么可以把一个数分裂成两个, 两个数的和为原数. 用最少的 ...

  3. hdu 4779 Tower Defense 2013杭州现场赛

    /** 题意: 有两种塔,重塔,轻塔.每种塔,能攻击他所在的一行和他所在的一列, 轻塔不 能被攻击,而重塔可以被至多一个塔攻击,也就是说重塔只能被重塔攻击.在一个n*m 的矩阵中,最少放一个塔,可放多 ...

  4. hdu4453 Looploop 2012年杭州现场赛 Splay

    题意:维护一个圈,实现六个功能,给某位置起的一些数增加某值,反转某一段数,添加删除某些数,移动当前所指的位置, 简单的splay,把圈拆成链,对于每种操作,处理一下. #define inf 0x3f ...

  5. hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: ...

  6. 2013 ACMICPC 杭州现场赛 I题

    #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #in ...

  7. 2013 Asia acm Hangzhou Regional Contest 杭州现场赛

     B Stealing Harry Potter's Precious 题目大意:给定一个n*m的地图,某些点可以走,某些点可以走某些点不可以走,给定一个起点,又给出了k个点k<=4,要求从起点 ...

  8. HDU 5920 Ugly Problem 高精度减法大模拟 ---2016CCPC长春区域现场赛

    题目链接 题意:给定一个很大的数,把他们分为数个回文数的和,分的个数不超过50个,输出个数并输出每个数,special judge. 题解:现场赛的时候很快想出来了思路,把这个数从中间分为两部分,当位 ...

  9. 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)

    题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...

随机推荐

  1. 牛客Another Distinct Values

    题目 我一开始试了一下n=3,发现不行,于是就猜测只有2可以,交了一发,通过了50%.所以我猜测只有偶数可以,奇数都不行. 中间空白部分放n=2的情况就行.因为n=2的情况时,最大只有2,所以我们可以 ...

  2. 记Selenium HTMLTestRunner 无法生成测试报告的总结

      使用Python ,HTMLTestRunner 生成测试报告时,遇到很奇怪的问题,明明运行的结果,没有任何报错,就是不生成测试报告,纠结好久.google+baidu搜索结果也不满意,最后终于解 ...

  3. linux安装jrockit 1.6

    文章目录 下载 安装 配置环境变量 下载 https://download.csdn.net/download/wthn163/10631876?utm_source=bbsseo 安装 将.bin结 ...

  4. python_way ,day22 tonardo,jsonp

    python_way day22 1.tonardo 2.cookie 3.api认证 一.tonardo: a.tonardo 初识 #!/usr/bin/env python3# Created ...

  5. java.util.Arrays,java.lang.Math,java.lang.System 类的常用方法汇总

    java.util.Arrays类是数组的工具类,一般数组常用的方法包括 二分查找:public static int  binarySearch(array[],int key),返回key的下标i ...

  6. XStream环境设置

    为Windows 2000/XP设置路径: 假设安装在c:Program Filesjavajdk目录: 在“我的电脑”右键单击并选择“属性”. 在“高级”选项卡下单击“环境变量”按钮. 现在,改变“ ...

  7. Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本的开发环境(亲测)

      写这篇博客时2D游戏引擎Cocos2d-x的最新版本为2.1.4,记得很久以前使用博客园博主子龙山人的一篇博文<Cocos2d-x win7+vs2010配置图文详解(亲测)>成功配置 ...

  8. CSS:Stacking Context

    通常情况下,HTML页面可以被认为是二维的,因为文本,图像和其他元素被排列在页面上而不重叠.在这种情况下,只有一个渲染进程,所有元素都知道其他元素所占用的空间.z-index属性可让你在渲染内容时调整 ...

  9. [未解决]报错:DeprecationWarning: decodestring() is a deprecated alias since Python 3.1, use decodebytes()

    DeprecationWarning: decodestring() is a deprecated alias since Python 3.1, use decodebytes()

  10. Hexo使用攻略-添加分类及标签

    创建"分类"选项 生成"分类"页并添加tpye属性 打开命令行,进入博客所在文件夹.执行命令 hexo new page categories 成功后会提示: ...