[HDOJ5934]Bomb(强连通分量,缩点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5934
题意:有n个炸弹,爆炸范围和点燃花费给你,如果一个爆炸那么它爆炸范围内的炸弹也会爆炸。问让所有炸弹爆炸的最小花费。
遍历任意两个炸弹,如果i在j的爆炸范围内,则建一条有向边。缩完点以后找入度为0的点点燃就行了。
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- typedef struct Edge {
- int u;
- int v;
- int next;
- Edge() { next = -; }
- }Edge;
- typedef struct P {
- LL x, y, r;
- int c;
- }P;
- const int maxn = ;
- P p[maxn];
- int head[maxn], ecnt;
- Edge edge[maxn*maxn];
- int n, m;
- int bcnt, dindex;
- int dfn[maxn], low[maxn];
- int stk[maxn], top;
- int belong[maxn];
- bool instk[maxn];
- int ret[maxn];
- int in[maxn];
- void init() {
- memset(edge, , sizeof(edge));
- memset(head, -, sizeof(head));
- memset(instk, , sizeof(instk));
- memset(dfn, , sizeof(dfn));
- memset(low, , sizeof(low));
- memset(belong, , sizeof(belong));
- ecnt = top = bcnt = dindex = ;
- }
- void adde(int uu, int vv) {
- edge[ecnt].u = uu;
- edge[ecnt].v = vv;
- edge[ecnt].next = head[uu];
- head[uu] = ecnt++;
- }
- void tarjan(int u) {
- int v = u;
- dfn[u] = low[u] = ++dindex;
- stk[++top] = u;
- instk[u] = ;
- for(int i = head[u]; ~i; i=edge[i].next) {
- v = edge[i].v;
- if(!dfn[v]) {
- tarjan(v);
- low[u] = min(low[u], low[v]);
- }
- else if(instk[v]) low[u] = min(low[u], dfn[v]);
- }
- if(dfn[u] == low[u]) {
- bcnt++;
- do {
- v = stk[top--];
- instk[v] = ;
- belong[v] = bcnt;
- } while(v != u);
- }
- }
- LL dis(P a, P b) {
- LL l1 = a.x - b.x;
- LL l2 = a.y - b.y;
- return l1 * l1 + l2 * l2;
- }
- int main() {
- // freopen("in", "r", stdin);
- int T, _ = ;
- scanf("%d", &T);
- while(T--) {
- scanf("%d", &n);
- init();
- memset(in, , sizeof(in));
- for(int i = ; i <= n; i++) ret[i] = ;
- for(int i = ; i <= n; i++) {
- scanf("%I64d%I64d%I64d%d",&p[i].x,&p[i].y,&p[i].r,&p[i].c);
- }
- for(int i = ; i <= n; i++) {
- for(int j = ; j <= n; j++) {
- if(i == j) continue;
- LL d = dis(p[i], p[j]);
- if(d <= (LL)p[i].r * p[i].r) adde(i, j);
- }
- }
- for(int i = ; i <= n; i++) {
- if(!dfn[i]) tarjan(i);
- }
- for(int i = ; i < ecnt; i++) {
- int u = edge[i].u, v = edge[i].v;
- if(belong[u] != belong[v]) in[belong[v]]++;
- }
- for(int i = ; i <= n; i++) {
- ret[belong[i]] = min(ret[belong[i]], p[i].c);
- }
- int tot = ;
- for(int i = ; i <= bcnt; i++) {
- if(!in[i]) tot += ret[i];
- }
- printf("Case #%d: ", _++);
- printf("%d\n", tot);
- }
- return ;
- }
[HDOJ5934]Bomb(强连通分量,缩点)的更多相关文章
- POJ1236Network of Schools[强连通分量|缩点]
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16571 Accepted: 65 ...
- POJ1236Network of Schools(强连通分量 + 缩点)
题目链接Network of Schools 参考斌神博客 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后 ...
- HD2767Proving Equivalences(有向图强连通分量+缩点)
题目链接 题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的 分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG.接下来,设有a个节点(每个节点对应 ...
- UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)
题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...
- ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)
题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...
- POJ2553 The Bottom of a Graph(强连通分量+缩点)
题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v). 把图的强连通分量缩点,那么答案显然就是所有出度为0的点. 用Tarjan找强连通分量: #include<cstdio&g ...
- uva 11324 The Largest Clique(强连通分量缩点+DAG动态规划)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...
- 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: ...
- tarjan算法(强连通分量 + 强连通分量缩点 + 桥(割边) + 割点 + LCA)
这篇文章是从网络上总结各方经验 以及 自己找的一些例题的算法模板,主要是用于自己的日后的模板总结以后防失忆常看看的, 写的也是自己能看懂即可. tarjan算法的功能很强大, 可以用来求解强连通分量, ...
- LA 4287 等价性证明(强连通分量缩点)
https://vjudge.net/problem/UVALive-4287 题意: 给出n个结点m条边的有向图,要求加尽量少的边,使得新图强连通. 思路:强连通分量缩点,然后统计缩点后的图的每个结 ...
随机推荐
- Yii2下拉框实现
详细介绍yii2下拉框的实现方法,以商品分类的下拉框为例: 第一种方法:使用Html的activeDropDownList(),该方法的优点是:可以自定义下拉框的样式.具体实现如下: 1.控制器中,获 ...
- imread函数、namedWindow函数、imshow函数、imwrite函数
1.imread函数 首先,我们看imread函数,可以在OpenCV官方文档中查到其原型如下: Mat imread(const string& filename, int flags=1 ...
- PL/SQL编程基础
范例:编写不做任何工作的PL/SQL块 BEGIN NULL ; END ; / 范例:编写一个简单的PL/SQL程序 DECLARE v_num NUMBER ; -- 定义一个变量v_num ...
- sql创建删除修改表的基本操作
1 建立表格 在建立好数据库以后,就可以根据储存资料的需求,使用SQL叙述建立所有需要的表格(table).建立表格的设定非常多,以建立"world.city"表格来说,它的叙述会 ...
- Android NDK 开发(三)--常见错误锦集合Log的使用【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511 Android NDK开发经常因某些因素会出现一些意想不到的错误, ...
- java网络编程之UDP通讯
详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...
- Linux自动删除n天前备份
Linux是一个很能自动产生文件的系统,日志.邮件.备份等.因此需要设置让系统定时清理一些不需要的文件. 语句写法: find 对应目录 -mtime +天数 -name "文件名" ...
- 利用python进行数据分析 (学习笔记)
第一章:准备工作 1.重要的Python库 (1)NumPy:Python科学计算的基础包.功能有:
- 完整学习git五git重置
git重置命令的一个用途就是修改引用的游标指向 1查看git操作日志 git reflog 2查看当前head游标的指向 cat .git/refs/heads/master 3重置和跳转 git r ...
- App store 如何使用 promo code | app store 打不开精品推荐和排行榜
1. app store 如何使用 promo code: 在app store的 右下角精品推荐标签页,拉到最下面 点击“兑换” ,跳转到新的页面,输入兑换码,然后右上角“兑换”,程序开始自动下载并 ...