在以刷水题的方式学了一两天c++后- -。。。写的第一道相对长的最大权闭合图的c++程序- -。。(还是pascal的风格)。。
贴上博客表示纪念- -
用了一种新的简单的方法写dinic。。速度非常快。。
一次是更新树状的增广路。。 可以ac这道题目
一年多前用旧的dinic写。。会tle两个点的囧。。。
#include <iostream> #define inf 1000000000 #define maxn 200000 int min (int x,int y) { return x>y?y:x ; } struct rec {int x, y,next,f,op;} bian[1000000]; int s,t,tfirst[maxn],first[maxn],level[maxn],q[maxn],n,m,tot,ans; void connect(int x,int y,int f) { tot++; bian[tot].x=x; bian[tot].y=y; bian[tot].f=f; bian[tot].next=first[x]; bian[tot].op=tot+1; first[x]=tot; tot++; bian[tot].x=y; bian[tot].y=x; bian[tot].f=0; bian[tot].next=first[y]; bian[tot].op=tot-1; first[y]=tot; } void init() { scanf("%d%d",&n,&m); s=n+m+1;t=s+1; int a,b,c; for (int i=1;i<=n;i++) { scanf("%d",&c); connect(i+m,t,c); } for (int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); ans += c; connect(s,i,c); connect(i,a+m,inf); connect(i,b+m,inf); } } bool bfs() { for (int i=1;i<=t;i++) { level[i] = inf ; tfirst[i] = first[i]; } level[s] = 0; q[1] = s; int l=1; for (int h=1;h<=l;h++) { int x=q[h]; for (int k=first[x];k;k=bian[k].next) { if (level[x]+1<level[bian[k].y] && bian[k].f) { level[bian[k].y] = level[x]+1; q[++l] = bian[k].y; if (q[l]==t) return true; } } } return 0; } int dfs(int x,int ff) { if (x==t) return ff; int tf=0,tmp=0; for (int k=tfirst[x];k;k=bian[k].next) { if ( bian[k].f && level[x]+1==level[bian[k].y]&& (tmp=dfs(bian[k].y,min(bian[k].f,ff))) ) { tf+=tmp; bian[k].f -= tmp; bian[bian[k].op].f += tmp; if (!(ff -= tmp)) break; } tfirst[x]=k; } if (!tfirst[x]) level[x] = inf; return tf; } void dinic() { int tmp=0; while (bfs()) { while (tmp=dfs(s,inf)) ans -= tmp; } printf("%d",ans); } int main() { init(); dinic(); }
Want to Support The Discord? Use any of Our Affilaite Links Below! Get Gnome Alerts:https://www.patreon.com/cryptognome Exchanges: Deribithttps://www.deribit.com/reg-2234.6442?q=home Bitmex:https://ww
Minimum Profit (mp) 是一个程序员文本编辑器,占用内存和磁盘空间很小,支持语法着色、上下文相关的帮助、同时编辑多个文件、ctags 支持。