constint N = 15; char g[N][N]; bool st[N][N]; int res; int h, w, d;
intcheck(int a, int b, int x, int y){ int ans = 0; for (int i = 0; i < h; i++) for (int j = 0; j < w; j++) if (g[i][j] == '.') if (abs(i - a) + abs(j - b) <= d || abs(i - x) + abs(j - y) <= d) { ans++; }
return ans; }
voidsolve(){ cin >> h >> w >> d; for (int i = 0; i < h; i++) for (int j = 0; j < w; j++) cin >> g[i][j];
// 确定第一台的位置 for (int i = 0; i < h; i++) for (int j = 0; j < w; j++) { // 确定第二台的位置 for (int x = 0; x < h; x++) for (int y = 0; y < w; y++) { // 如果是同一个点,跳过 if (i == x && j == y) continue; // 如果两个点都是 地板 if (g[i][j] == '.' && g[x][y] == '.') { res = max(res, check(i, j, x, y)); } } } cout << res << endl; }
while (q.size()) { int now = q.front(); q.pop(); st[now] = false;
for (int i = h[now]; i != -1; i = ne[i]) { int next = e[i]; if (dist[next] > dist[now] + w[i]) { dist[next] = dist[now] + w[i]; if (!st[next]) { q.push(next); st[next] = true; } } } } }
voidsolve(){ // 读入网格数据 cin >> H >> W >> d; for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) cin >> g[i][j];
// 建图 memset(h, -1, sizeof h); for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) { // ‘#’点不建图 if (g[i][j] == '#') continue; int now = i * W + j; // ‘H’点额外添加和虚拟节点 1e6+5 的 0 边权的边 if (g[i][j] == 'H') { add(1e6 + 5, now, 0), add(now, 1e6 + 5, 0); } // 看一下周围四个点能不能建边 for (int k = 0; k < 4; k++) { int a = i + dx[k], b = j + dy[k]; // 越界 if (a < 0 || a >= H || b < 0 || b >= W) continue; // 遇到 # if (g[a][b] == '#') continue; // 建边 add(now, a * W + b, 1); } }
spfa();
// 遍历,看距离 H 在 d 以内的点有多少 int res = 0; for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) if (g[i][j] != '#' && dist[i * W + j] <= d) res++;
voidsolve(){ cin >> n >> m >> k; // 读入所有的边 for (int i = 0; i < m; i++) { int a, b, c; cin >> a >> b >> c; e[i] = {c, a, b}; } // 储存 A 和 B for (int i = 0; i < k; i++) cin >> A[i]; for (int i = 0; i < k; i++) cin >> B[i]; // 并查集初始化 for (int i = 1; i <= n; i++) p[i] = i; // 按照边权升序排列 sort(e, e + m, cmp);
// 预处理A和B中,每个元素的数量,存在cnta和cntb中 for (int i = 0; i < k; i++) { cnta[A[i]]++; cntb[B[i]]++; }
// 遍历每一条边 LL res = 0; for (int i = 0; i < m; i++) { // 看加入i边后,能匹配多少对 res += merge(e[i].u, e[i].v) * e[i].w; }