Bomb HDU - 5934 (Tarjan)
- #include<map>
- #include<set>
- #include<ctime>
- #include<cmath>
- #include<stack>
- #include<queue>
- #include<string>
- #include<vector>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define lowbit(x) (x & (-x))
- typedef unsigned long long int ull;
- typedef long long int ll;
- const double pi = 4.0*atan(1.0);
- const int inf = 0x3f3f3f3f;
- const int maxn = ;
- const int maxm = ;
- const int mod = ;
- using namespace std;
- int n, m, tol, T;
- int cnt, top, sz;
- struct Edge {
- ll x;
- ll y;
- ll r;
- ll w;
- };
- struct Node {
- int u;
- int v;
- int next;
- };
- Node node[maxm];
- Edge edge[maxn];
- int head[maxn];
- int dfn[maxn];
- int low[maxn];
- int fath[maxn];
- int sta[maxn];
- bool vis[maxn];
- int point[maxn];
- int ind[maxn];
- ll cost[maxn];
- void init() {
- cnt = tol= top = sz = ;
- memset(ind, , sizeof ind);
- memset(sta, , sizeof sta);
- memset(dfn, , sizeof(dfn));
- memset(low, , sizeof(low));
- memset(fath, , sizeof(fath));
- memset(head, -, sizeof(head));
- memset(cost, inf, sizeof cost);
- memset(point, , sizeof point);
- memset(vis, false, sizeof(vis));
- }
- ll calc(int i, int j) {
- ll x1 = edge[i].x;
- ll x2 = edge[j].x;
- ll y1 = edge[i].y;
- ll y2 = edge[j].y;
- ll ans = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
- return ans;
- }
- void addnode(int u, int v) {
- node[tol].u = u;
- node[tol].v = v;
- node[tol].next = head[u];
- head[u] = tol++;
- }
- void dfs(int u) {
- int v;
- dfn[u] = low[u] = ++cnt;
- sta[sz++] = u;
- vis[u] = true;
- for(int i=head[u]; ~i; i=node[i].next) {
- v = node[i].v;
- if(!dfn[v]) {
- dfs(v);
- low[u] = min(low[u], low[v]);
- } else if(vis[v]) {
- low[u] = min(low[u], dfn[v]);
- }
- }
- if(low[u] == dfn[u]) {
- ++top;
- do{
- v = sta[--sz];
- vis[v] = false;
- point[v] = top;
- } while(v != u);
- }
- }
- void tarjan() {
- for(int u=; u<=n; u++) {
- if(!dfn[u]) dfs(u);
- }
- }
- void solve() {
- for(int u=; u<=n; u++) {
- for(int i=head[u]; ~i; i=node[i].next) {
- int v = node[i].v;
- if(point[u] != point[v]) ind[point[v]]++;
- }
- }
- }
- int main() {
- scanf("%d", &T);
- int cas = ;
- while(T--) {
- init();
- scanf("%d", &n);
- for(int i=; i<=n; i++) scanf("%lld%lld%lld%lld", &edge[i].x, &edge[i].y, &edge[i].r, &edge[i].w);
- for(int i=; i<=n; i++) {
- for(int j=; j<=n; j++) {
- if(i == j) continue;
- ll a = edge[i].r * edge[i].r;
- ll b = calc(i, j);
- if(a >= b) addnode(i, j);
- }
- }
- tarjan();
- // for(int i=1; i<=n; i++) printf("%d %d\n", i, point[i]);
- solve();
- // for(int i=1; i<=n; i++) printf("%d %d\n", i, ind[point[i]]);
- for(int i=; i<=n; i++) {
- if(!ind[point[i]]) {
- cost[point[i]] = min(cost[point[i]], edge[i].w);
- }
- }
- ll ans = ;
- for(int i=; i<=top; i++) {
- if(!ind[i]) ans += cost[i];
- }
- printf("Case #%d: %lld\n", cas++, ans);
- }
- return ;
- }
给出n个炸弹,然后炸弹有爆炸范围,当一个炸弹爆炸的时候,这个范围内的其他炸弹也会爆炸,所以我们可以把可以相互引爆的炸弹缩成一个点,然后对于缩完以后的点,如果我缩完点的点,判断他的入度,如果我的入度不为0,说明我这个点里面的小点可以通过别的炸弹引爆它,那就没必要去炸它了,如果我的入度是0的话,我就需要手动引爆,然后去找这个点里面的小的点的引爆的最小值,然后加起来就可以了
Bomb HDU - 5934 (Tarjan)的更多相关文章
- Equivalent Sets HDU - 3836 (Tarjan)
题目说给出一些子集,如果A是B的子集,B是A的子集,那么A和B就是相等的,然后给出n个集合m个关系,m个关系表示u是v的子集,问你最小再添加多少个关系可以让这n个集合都是相等的 如果这n个几个都是互相 ...
- Bomb HDU - 3555 (数位DP)
Bomb HDU - 3555 (数位DP) The counter-terrorists found a time bomb in the dust. But this time the terro ...
- 【BZOJ4331】[JSOI2012]越狱老虎桥(Tarjan)
[BZOJ4331][JSOI2012]越狱老虎桥(Tarjan) 题面 BZOJ 然而BZOJ是权限题QwQ 洛谷 题解 先求出所有割边,那么显然要割掉一条割边. 如果要加入一条边,那么显然是把若干 ...
- 【BZOJ2208】[JSOI2010]连通数(Tarjan)
[BZOJ2208][JSOI2010]连通数(Tarjan) 题面 BZOJ 洛谷 题解 先吐槽辣鸡洛谷数据,我写了个\(O(nm)\)的都过了. #include<iostream> ...
- A * B Problem Plus HDU - 1402 (FFT)
A * B Problem Plus HDU - 1402 (FFT) Calculate A * B. InputEach line will contain two integers A and ...
- D - 淡黄的长裙 HDU - 4221(贪心)
D - 淡黄的长裙 HDU - 4221(贪心) James is almost mad! Currently, he was assigned a lot of works to do, so ma ...
- 浅谈强连通分量(Tarjan)
强连通分量\(\rm (Tarjan)\) --作者:BiuBiu_Miku \(1.\)一些术语 · 无向图:指的是一张图里面所有的边都是双向的,好比两个人打电话 \(U ...
- hdu---(3555)Bomb(数位dp(入门))
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- hdu 5055(坑)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5055 Bob and math problem Time Limit: 2000/1000 MS ( ...
随机推荐
- Golang中进行reslice时的注意事项
先看下面代码: package main import "fmt" func main() { slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8} ...
- 四、Object.defineProperty总结
Object.defineProperty() 参考:https://segmentfault.com/a/1190000007434923 定义: 方法会直接在一个对象上定义一个新属性,或者修改一个 ...
- CentOS7安装Jenkins自动化部署maven项目
前言: 最近要弄一个jenkins工具,已经安装好了并且jenkins使用部署项目的流程已经基本走通,上图: 话不多说,开始 第一步:安装jenkins: [ 准备环境: 在centOS7环境上:安装 ...
- dart正则
1.前言 API中对于正则表达式的注释是:正则表达式的规范和语义与JavaScript相同详细的规范可以参考:http://ecma-international.org/ecma-262/5.1/#s ...
- keras中TimeDistributed的用法
TimeDistributed这个层还是比较难理解的.事实上通过这个层我们可以实现从二维像三维的过渡,甚至通过这个层的包装,我们可以实现图像分类视频分类的转化. 考虑一批32个样本,其中每个样本是一个 ...
- vue ajax
局部get: this.$http.get(url,{param:jsonData}).then(successCallback,failCallBack) 局部post: this.$http.po ...
- hdu-2222(ac自动机模板)
题意:给你一个长度为n的单词表,一个文本串,问你这个文本串中出现了单词表中多少个单词: 解题思路:ac自动机的模板题,可以直接当模板用: 代码: #include<iostream> #i ...
- hdu-1421(dp)
解题思路:dp[i][j]表示前i个物品中取k对所要的最小花费: 首先得对物品进行处理,因为需要当前物品减前一个物品的平方和最小: 所以先排序,因为排序的相邻两个的差的平方一定最小: 然后转移方程:d ...
- BZOJ3291Alice与能源计划——匈牙利算法+模拟费用流
题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验.为 了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...
- [NOIp2016] 蚯蚓
类型:单调队列 传送门:>Here< 题意:有$N$只蚯蚓,每秒都会伸长$q$.每一次都会有人选出最长的一条切成两半,长度分别是$\left \lfloor px \right \rflo ...