题目大意
二维平面上有 n 个爆炸桶, i − t h i-th i−th爆炸桶位置为 ( x i , y i ) (x_i, y_i) (xi,yi) 爆炸范围为 r i r_i ri ,且需要 c i c_i ci 的价格引爆,求把所有桶引爆所需的钱。
分析
通过求有向图的强连通分量,求出所有爆炸块(满足引爆一个块内的任意一个爆炸桶就可以摧毁这个块内的爆炸桶),然后把所有爆炸块视为一个爆炸桶,价值为爆炸块内的价值最小值,然后重建有向图,将新建的有向图所有入度为 0 的点的价值相加,就是答案。
AC-Code
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1100; // 点数
const int MAXM = 1000100; // 边数
struct Edge {
int to, next;
} edge[MAXM]; // 只有这里写的是 MAXM
int head[MAXN], tot;
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
// num 数组不一定需要,结合实际情况
void addedge(