[LibreOJ 2100][TJOI2015]线性代数
转载请注明出处:http://danihao123.is-programmer.com/
颓一波式子可以发现答案就是\(ABA^T-CA^T\)。然后发现对于一个\(B\)中的元素\(B_{i, j}\)要对答案做出贡献要求\(A_i\)和\(A_j\)都为1,而\(A_i\)为1会导致答案减去一个\(C_i\)。
因此我们可以分别对\(B\)中元素和\(A\)中元素建点。\(B\)中元素会带来收益,但是要求依赖两个\(A\)中元素。而\(A\)中元素会带来一定的笋丝。这个就已经事很明显的最大权闭合子图力,,,
代码:
#include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <functional> #include <utility> #include <vector> #include <queue> #include <stack> const int maxn = 505; const int maxno = 500 * 500 + 500 + 5; const int maxm = 2 * (500 * 500 * 3 + 500 + 5); int first[maxno]; int next[maxm], to[maxm], flow[maxm], cap[maxm]; int gcnt = 0; void add_edge(int u, int v, int c) { gcnt ++; next[gcnt] = first[u]; first[u] = gcnt; to[gcnt] = v; cap[gcnt] = c; flow[gcnt] = 0; } void ins_edge(int u, int v, int c) { add_edge(u, v, c); add_edge(v, u, 0); } int rev(int i) { if(1 & i) { return i + 1; } else { return i - 1; } } int d[maxno]; int s, t, num; bool bfs() { static bool vis[maxno]; std::fill(vis, vis + num + 1, false); std::fill(d, d + num + 1, 0); std::queue<int> Q; Q.push(s); d[s] = 1; vis[s] = true; while(!Q.empty()) { int u = Q.front(); Q.pop(); for(int i = first[u]; i; i = next[i]) { int v = to[i]; if(!vis[v] && cap[i] > flow[i]) { d[v] = d[u] + 1; Q.push(v); vis[v] = true; } } } return vis[t]; } int cur[maxno]; int dfs(int x, int a) { if(a == 0 || x == t) return a; int ret = 0; for(int &i = cur[x]; i; i = next[i]) { int v = to[i], f; if(d[v] == d[x] + 1 && (f = dfs(v, std::min(a, cap[i] - flow[i]))) > 0) { ret += f; a -= f; flow[i] += f; flow[rev(i)] -= f; if(a == 0) break; } } if(a > 0) d[x] = -1; return ret; } int dinic() { int ret = 0; while(bfs()) { for(int i = 0; i <= num; i ++) cur[i] = first[i]; ret += dfs(s, 0x7f7f7f7f); } return ret; } int n; int main() { int ans = 0; scanf("%d", &n); s = 0, t = n * n + n + 1; num = t; for(int i = 1; i <= n; i ++) { for(int j = 1; j <= n; j ++) { int u = (i - 1) * n + j; int val; scanf("%d", &val); ans += val; ins_edge(s, u, val); ins_edge(u, n * n + i, 0x7f7f7f7f); ins_edge(u, n * n + j, 0x7f7f7f7f); } } for(int i = 1; i <= n; i ++) { int val; scanf("%d", &val); ins_edge(n * n + i, t, val); } ans -= dinic(); printf("%d\n", ans); return 0; }
Sep 08, 2022 07:21:49 PM
JKBOSE Model Paper 2023 Class 6 Pdf Download with Answers for English Medium, Hindi Medium, Urdu Medium & Students for Small Answers, Long Answer, Very Long Answer Questions, and Essay Type Questions to Term1 & Term2 Exams at official website. JK Board Model Paper Class 6 New Exam Scheme or Question Pattern for Sammittive Assignment Exams (SA1 & SA2): Very Long Answer (VLA), Long Answer (LA), Small Answer (SA), Very Small Answer (VSA), Single Answer, Multiple Choice and etc.