给你一个二维网格图,然后有一些特殊点,它每隔一个时刻让它四边的点变成特殊点。
然后你可以在两个点之间建一个屏障使得无法转变。
然后使得一个普通点变成特殊点要费用 c,建立屏障是要 1 费用。
要你最小化总费用。
牛牛防疫情
题目大意:
——>点我跳转<——
题目大意
给你一个二维网格图,然后有一些特殊点,它每隔一个时刻让它四边的点变成特殊点。
然后你可以在两个点之间建一个屏障使得无法转变。
然后使得一个普通点变成特殊点要费用 c,建立屏障是要 1 费用。
要你最小化总费用。
思路
这道题我们考虑用网络流来做。
这么一想之后你就会发现这题确实可以网络流。
相当于搞最小割,所有点向汇点连边流量是 c 表示被感染,然后本身被感染的点连向源点流量 INF 表示被感染。然后点和它四边之间连边流量是 1 表示要建护栏。
然后跑最小割就是答案。
代码
#include<map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define INF 1000000000
using namespace std;
struct node {
int x, to, nxt;
}e[500004];
int n, m, x, y, le[50001], KK, dis[50001], S, T, lee[50001];
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
int ans, c;
void add(int x, int y, int z) {
e[++KK] = (node){z, y, le[x]}; le[x] = KK;
e[++KK] = (node){0, x, le[y]}; le[y] = KK;
}
int get_nm(int x, int y) {
return (x - 1) * n + y;
}
bool bfs() {
queue <int> q;
memcpy(lee, le, sizeof(lee));
memset(dis, 0x7f, sizeof(dis));
dis[S] = 0;
q.push(S);
int now;
while (!q.empty()) {
now = q.front();
q.pop();
for (int i = le[now]; i; i = e[i].nxt)
if (e[i].x && dis[e[i].to] > dis[now] + 1) {
dis[e[i].to] = dis[now] + 1;
q.push(e[i].to);
}
}
return dis[T] < INF;
}
int dfs(int now, int sum) {
if (now == T) return sum;
int go = 0, this_go;
for (int i = lee[now]; i; i = e[i].nxt) {
lee[now] = i;
if (e[i].x && dis[e[i].to] == dis[now] + 1) {
this_go = dfs(e[i].to, min(e[i].x, sum - go));
if (this_go) {
e[i].x -= this_go;
e[i ^ 1].x += this_go;
go += this_go;
if (go == sum) return go;
}
}
}
return go;
}
void dinic() {
while (bfs()) {
ans += dfs(S, INF);
}
}
int main() {
KK = 1;
scanf("%d %d %d", &n, &m, &c);
S = 50000 - 1; T = 50000 - 2;
for (int i = 1; i <= m; i++) {
scanf("%d %d", &x, &y); x++; y++;
add(S, get_nm(x, y), INF);
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
add(get_nm(i, j), T, c);
for (int k = 0; k < 4; k++) {
x = i + dx[k]; y = j + dy[k];
if (1 <= x && x <= n && 1 <= y && y <= n) {
add(get_nm(i, j), get_nm(x, y), 1);
}
}
}
dinic();
printf("%d", ans - c * m);
return 0;
}
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现