萌新Dinic WA64分求助!

P2774 方格取数问题

~~qndmx~~
by Belarus @ 2020-02-04 10:51:23


@[光明正大](/user/121563) 可以借个楼吗,我的代码也在这个点RE了
by 雷神山速度 @ 2020-02-29 11:57:14


```cpp #include <bits/stdc++.h> using namespace std; int read(){ int num = 0, x = 1; char c = getchar(); while(c < '0' || c > '9'){ if(c == '-') x = -x; c = getchar(); } while(c <= '9' && c >= '0'){ num = (num << 1) + (num << 3) + c - '0'; c = getchar(); } return num * x; } const int INF = 0x3f3f3f3f; const int MAX_V = 200010; int level[MAX_V]; int iter[MAX_V]; int n, m, s, t, sum; int g[110][110]; int det[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; struct edge{ int to, cap, rev; edge(int _to, int _cap, int _rev):to(_to), cap(_cap), rev(_rev){} }; vector<edge>G[MAX_V]; struct point{ int x, y; }; int Transf(point x){ return (x.x - 1) * m + x.y; } void add_edge(int from, int to, int cap){ G[from].push_back(edge(to, cap, G[to].size())); G[to].push_back(edge(from, 0, G[from].size() - 1)); } inline void bfs(int s){ memset(level, -1, sizeof(level)); queue<int>que; level[s] = 0; que.push(s); while(!que.empty()){ int v = que.front(); que.pop(); for(register int i = 0; i < G[v].size(); ++i){ edge &e = G[v][i]; if(e.cap > 0 && level[e.to] < 0){ level[e.to] = level[v] + 1; que.push(e.to); } } } return; } inline int dfs(int v, int t, int f){ if(v == t) return f; for(register int &i = iter[v]; i < G[v].size(); ++i){ edge &e = G[v][i]; if(e.cap > 0 && level[v] < level[e.to]){ int d = dfs(e.to, t, min(f, e.cap)); if(d > 0){ e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } int max_flow(int s, int t){ int flow = 0; for(;;){ bfs(s); if(level[t] < 0) return flow; memset(iter, 0, sizeof(iter)); int f; while((f = dfs(s, t, INF)) > 0) flow += f; } return flow; } int main(){ n = read(), m = read(); s = 0, t = n * m + 1, sum = 0; for(register int i = 1; i <= n; ++i){ for(register int j = 1; j <= m; ++j){ g[i][j] = read(); sum += g[i][j]; } } for(register int i = 1; i <= n; ++i){ for(register int j = 1; j <= m; ++j){ point u = (point){i, j}; if((i + j) & 1){ for(register int k = 0; k < 4; ++k){ point v = u; v.x += det[k][0]; v.y += det[k][1]; if(v.x >= 0 && v.x <= n && v.y >= 1 && v.y <= m){ add_edge(Transf(u), Transf(v), INF); add_edge(Transf(v), Transf(u), 0); } } add_edge(s, Transf(u), g[i][j]); add_edge(Transf(u), s, 0); } else{ add_edge(Transf(u), t, g[i][j]); add_edge(t, Transf(u), 0); } } } printf("%d\n", sum - max_flow(s, t)); return 0; } ```
by 雷神山速度 @ 2020-02-29 11:57:54


@[雷神山速度](/user/320102) 话说我是WA不是RE... 不过我已经过了
by 光明正大 @ 2020-02-29 13:51:05


@[光明正大](/user/121563) 不重要了,帮帮忙~~我实在是太弱了~~
by 雷神山速度 @ 2020-02-29 20:44:19


@[雷神山速度](/user/320102) 你看你连边得地方写的是: if(v.x>=0&&....) 应该是v.x>=1
by 光明正大 @ 2020-03-01 07:41:40


@[光明正大](/user/121563) 多谢
by 雷神山速度 @ 2020-03-02 20:07:39


|