P3973 [TJOI2015]线性代数
https://www.luogu.com.cn/problem/P3973
欺诈题
挺不错的一道题
大力随机化可以拿到99的高分:评测记录
先来化一波式子
考虑这条式子的意义
如果都为,那么会失去,并获得
这很容易让我们想到最小割
每个对应一个点,向连一条容量为的边
对于每个,向连一条容量为的边
每个向连的边
然后用即可
code:
#include<bits/stdc++.h>
#define N 1000050
using namespace std;
struct edge {
int v, nxt, c;
} e[N << 1];
int p[N], eid;
void init() {
memset(p, -1, sizeof p);
eid = 0;
}
void insert(int u, int v, int c) {
e[eid].v = v;
e[eid].c = c;
e[eid].nxt = p[u];
p[u] = eid ++;
}
void add(int u, int v, int c) {
insert(u, v, c), insert(v, u, 0);
}
const int inf = 1e9;
int S, T, d[N];
queue<int> q;
int bfs() {
for(int i = 0; i <= T; i ++) d[i] = -1;
q.push(S), d[S] = 0;
while(q.size()) {
int u = q.front(); q.pop();
for(int i = p[u]; i + 1; i = e[i].nxt) {
int v = e[i].v, c = e[i].c;
if(c && d[v] == -1) {
d[v] = d[u] + 1;
q.push(v);
}
}
}
return d[T] != -1;
}
int dfs(int u, int flow) {
if(u == T) return flow;
int ret = 0;
for(int i = p[u]; i + 1; i = e[i].nxt) {
int v = e[i].v, c = e[i].c;
if(c && d[v] == d[u] + 1) {
int tmp = dfs(v, min(flow, c));
e[i].c -= tmp, e[i ^ 1].c += tmp;
flow -= tmp, ret += tmp;
if(!flow) break;
}
}
if(!ret) d[u] = - 1;
return ret;
}
int Dinic() {
int ret = 0;
for(; bfs() ;) ret += dfs(S, inf);
return ret;
}
int n;
int id(int i, int j) {
return (i - 1) * n + j;
}
int main() {
init();
scanf("%d", &n);
S = n * n + n + 1, T = S + 1;
int ans = 0;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++) {
int x;
scanf("%d", &x); ans += x;
add(S, id(i, j), x);
add(id(i, j), n * n + i, inf);
add(id(i, j), n * n + j, inf);
}
for(int i = 1; i <= n; i ++) {
int x;
scanf("%d", &x);
add(i + n * n, T, x);
}
printf("%d", ans - Dinic());
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2020-02-16 数学初联杂题乱讲