模板——Dinic
震惊,照着SYCstudio的教程打出来的Dinic竟被呆滞怒斥是EK,惊了,打开教程的方式可能跟呆滞不太一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include<bits/stdc++.h> using namespace std; const int P=1000000007; int n,m,s,t,jump[100005]={0},num=1,deep[100005]; struct edge{ int to,val,jump; }a[200005]; void add( int x, int y, int z){ num++; a[num].jump=jump[x]; jump[x]=num; a[num].to=y; a[num].val=z; } bool bfs(){ queue< int > q; while (!q.empty()) q.pop(); for ( int i=1; i<=n; i++) deep[i]=0; deep[s]=1; q.push(s); while (!q.empty()){ int pos=q.front(); q.pop(); for ( int i=jump[pos]; i; i=a[i].jump){ if (!deep[a[i].to] && a[i].val>0){ deep[a[i].to]=deep[pos]+1; q.push(a[i].to); } } } return deep[t]!=0; } int dfs( int pos, int len){ if (pos==t) return len; int used=0,w=0; for ( int i=jump[pos]; i; i=a[i].jump){ if (deep[a[i].to]==deep[pos]+1 && a[i].val>0){ w=len-used; int le=dfs(a[i].to,min(w,a[i].val)); a[i].val-=le; a[i^1].val+=le; used+=le; if (used==len) return len; } } if (!s) deep[pos]=0; return used; } int main(){ int ans=0; scanf ( "%d%d%d%d" ,&n,&m,&s,&t); for ( int i=1,x,y,z; i<=m; i++){ scanf ( "%d%d%d" ,&x,&y,&z); add(x,y,z); add(y,x,0); } int d; while (bfs()){ ans+=dfs(s,P); } printf ( "%d" ,ans); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步