萌新刚学网络流,Dinic TLE 求助

P2774 方格取数问题

### 你可以参考一下我写的这份代码 ```cpp #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> //#define int long long #define rep(x, a, b) for(int x = (a); x <= (b); ++x) #define rop(x, a, b) for(int x = (a); x < (b); ++x) #define per(x, a, b) for(int x = (a); x >= (b); --x) using namespace std; typedef long long LL; typedef double DB; struct Queue { int Que[16888], hd, tl, mo; Queue() {mo = 16383; hd = tl = 0;} void push(int x) {Que[tl & mo] = x; ++tl;} void pop() {++hd;} int front() {return Que[hd & mo];} int size() {return tl - hd;} void clear() {hd = tl = 0;} }Q; struct graph { int hd[10005], vr[200005], vl[200005], nt[200005], tt; int s, t, vs[10005], ds[10005], cr[10005]; void push(int x, int y, int z) { vr[++tt] = y; vl[tt] = z; nt[tt] = hd[x]; hd[x] = tt; } int dfs(int nw, int mf) { if(nw == t) return mf; int RS = mf; for(int &i = cr[nw]; i; i = nt[i]) { if(vl[i] == 0 || ds[vr[i]] != ds[nw] + 1) continue; int K = dfs(vr[i], min(RS, vl[i])); vl[i] -= K; vl[i ^ 1] += K; RS -= K; if(RS == 0) return mf; } return mf - RS; } bool bfs() { memset(ds, 0x3f, sizeof(ds)); ds[s] = 0; Q.push(s); while(Q.size()) { int nw = Q.front(); Q.pop(); for(int i = hd[nw]; i; i = nt[i]) { if(vl[i] == 0 || ds[vr[i]] <= ds[nw] + 1) continue; ds[vr[i]] = ds[nw] + 1; Q.push(vr[i]); } } return ds[t] != 0x3f3f3f3f; } long long dinic() { long long F = 0; int fl = 0; while(bfs()) { memcpy(cr, hd, sizeof(hd)); F += dfs(s, 0x3f3f3f3f); } return F; } }G; int n, m, x, y, z, w; signed main() { scanf("%d%d%d%d", &n, &m, &G.s, &G.t); G.tt = 1; rep(i, 1, m) { scanf("%d%d%d", &x, &y, &z); G.push(x, y, z); G.push(y, x, 0); } cout << G.dinic(); return 0; }
by xjsmsms @ 2023-08-15 16:25:17


《萌新》
by xjsmsms @ 2023-08-15 16:25:54


据我所知 80% 以上 Dinic TLE 都是因为当前弧优化假了。
by K8He @ 2023-08-15 16:28:50


@[K8He](/user/306045) 可能吧,本蒟蒻也是第一次写,哪里不对多多指正QWQ
by xjsmsms @ 2023-08-15 16:31:57


@[shinzanmono](/user/610557) ```cpp for(int p=chead[u];p&&lim;p=graph[p].nxt){ chead[u]=p; int v=graph[p].to; if(dep[v]==dep[u]+1&&graph[p].w!=0){ arc=dfs(v,std::min(lim,graph[p].w)); path+=arc,lim-=arc; graph[p].w-=arc,graph[p^1].w+=arc; } } ``` 改成: ```cpp for(int& p=chead[u];p;p=graph[p].nxt){ chead[u]=p; int v=graph[p].to; if(dep[v]==dep[u]+1&&graph[p].w!=0){ arc=dfs(v,std::min(lim,graph[p].w)); if(!arc)dep[v]=0; path+=arc,lim-=arc; graph[p].w-=arc,graph[p^1].w+=arc; if(lim<=0)break; } } ``` 试试
by K8He @ 2023-08-15 16:32:42


@[xuchengkun](/user/723205) 你这个当前弧优化好像挺对的吧
by K8He @ 2023-08-15 16:33:55


```cpp if(!arc)dep[v]=0; ``` 是无用点优化,不是当前弧优化。忘了说了。
by K8He @ 2023-08-15 16:34:58


艹原来楼主早就过了
by K8He @ 2023-08-15 16:36:35


好了,其实是 `dep` 开小了/qd
by shinzanmono @ 2023-08-15 18:57:21


|