[hdu 5934 Bomb]Tarjan强连通分量
2016-10-29 18:39
459 查看
[hdu 5934 Bomb]Tarjan强连通分量
题目链接:[hdu 5934 Bomb]题意描述:
有N个炸弹,第i个炸弹的坐标是(xi,yi), 半径为ri,手动将其引爆的花费是ci。如果炸弹a在另外一个炸弹b的爆炸范围内,那么b的爆炸会引起a的爆炸。求让所有的炸弹爆炸的最小花费。
解题思路:
如果炸弹a在另外一个炸弹b的爆炸范围内,那么就添加一条a到b的有向边,然后对图缩点,统计强连通分量中最小的顶点权值,以及每个缩点的入度。然后答案就是,所有入度为0的缩点中的最小的顶点权值之和。
#include <bits/stdc++.h> using namespace std; typedef __int64 LL; typedef pair<LL, LL> PLL; const int MAXN = 1000 + 5; int T, cas, N; struct QNode { LL x, y, r, c, id; } q[MAXN]; vector<int> G[MAXN]; int In[MAXN]; // 入度 int Low[MAXN], DFN[MAXN], Stack[MAXN], Belong[MAXN]; //Belong数组的值是1~scc int Index, top; int scc;//强连通分量的个数 bool Instack[MAXN]; int num[MAXN];//各个强连通分量包含点的个数,数组编号1~scc LL w[MAXN]; // 联通分量中最小值 void Tarjan(int u) { int v, sz = G[u].size(); Low[u] = DFN[u] = ++Index; Stack[top++] = u; Instack[u] = true; for(int i = 0; i < sz; i++) { v = G[u][i]; if(!DFN[v]) { Tarjan(v); if( Low[u] > Low[v] )Low[u] = Low[v]; } else if(Instack[v] && Low[u] > DFN[v]) Low[u] = DFN[v]; } if(Low[u] == DFN[u]) { scc++; do { v = Stack[--top]; Instack[v] = false; Belong[v] = scc; num[scc]++; } while( v != u); } } void work() { memset(DFN, 0, sizeof(DFN)); memset(Instack, false, sizeof(Instack)); memset(num, 0, sizeof(num)); memset(In, 0, sizeof(In)); Index = scc = top = 0; for(int i = 1; i <= N; i++) if(!DFN[i]) Tarjan(i); memset(w, 0x3f, sizeof(w)); for(int u = 1; u <= N; u++) { int x = Belong[u], y, v, sz = G[u].size();; w[x] = min(w[x], q[u].c); for(int j = 0; j < sz; j++) { v = G[u][j], y = Belong[v]; if(x == y) continue; In[y] ++; } } } inline bool IsInter(QNode& a, QNode& b) { LL dist = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); return dist <= a.r * a.r; } int main() { scanf("%d", &T); cas = 0; while(T --) { scanf("%d", &N); for(int i = 1; i <= N; i++) { scanf("%I64d %I64d %I64d %I64d", &q[i].x, &q[i].y, &q[i].r, &q[i].c); } for(int i = 1; i <= N; i++) { G[i].clear(); for(int j = 1; j <= N; j++) { if (j == i) continue; if(IsInter(q[i], q[j])) { G[i].push_back(j); } } } work(); LL ans = 0; for(int i = 1; i <= scc; i++) { if(In[i] == 0) { ans += w[i]; } } printf("Case #%d: %I64d\n", ++cas, ans); } return 0; }
相关文章推荐
- 【2016-CCPC-B】强连通分量,tarjan(Bomb,hdu 5934)
- HDU-5934 Bomb(tarjan缩点+入度0最小和)
- 【(最小权点基)tarjan强连通分量缩点+tarjan模板】HDU 5934 Bomb
- HDU 5934 Bomb(强连通分量)
- HDU 5934 Bomb (tarjan缩点)
- HDU 5934 Bomb(tarjan缩点)
- hdu 5934 Bomb【最小点基----Tarjan强连通+缩点染色】
- -----tarjan强连通分量缩点-hdu 5934 -Bomb
- HDU-2767 Proving Equivalences (强连通分量[Tarjan])
- 【HDU】5934 Bomb 强连通分量+缩点
- HDU-5934 Bomb 缩点
- HDU 1269:迷宫城堡 (Tarjan强连通分量)
- HDU 3836 tarjan求强连通分量
- hdu 1269 迷宫城堡(Tarjan 图的强连通分量)
- HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))
- 【HDU 5934】Bomb(强连通缩点)
- HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))
- hdu 5934 Bomb
- HDU - 5934 - Bomb (强连通缩点)
- hdu 5934-建图+tarjan缩点