震惊!不用反向边

P3376 【模板】网络最大流

草地排水AC代码 ```cpp #include<cstdio> #include<iostream> using namespace std; long long to[401],s[401],last[401],head[201],n,m; int a[201],b[201],d[201]; long long p=0; void add(int u,int v,int w) { p++; last[p]=head[u]; s[p]=w; to[p]=v; head[u]=p; } bool bfs() { int hed=0,tail=1; a[1]=1; b[1]=1; d[1]=1; while(hed<tail) { hed++; int j=head[a[hed]]; while(j!=0) { if(!b[to[j]]&&s[j]>0) { tail++; a[tail]=to[j]; b[to[j]]=d[tail]=d[hed]+1; } j=last[j]; } } if(b[n]) return 1; return 0; } int dfs(long long now,long long mint) { if(now==n||mint<=0) return mint; int j=head[now]; while(j!=0) { int t1; if(b[now]+1==b[to[j]]&&s[j]>0) { t1=dfs(to[j],min(mint,s[j])); if(t1>0) { s[j]-=t1; s[j^1]+=t1; return t1; } } j=last[j]; } } int main() { long long t1,t2,t3; scanf("%d%d",&m,&n); for(int j=1;j<=m;j++) { scanf("%d%d%d",&t1,&t2,&t3); add(t1,t2,t3); add(t2,t1,0); } /*add((i-1)*n+j,(i-1)*n+j+1,t); add((i-1)*n+j+1,(i-1)*n+j,t); } for(int i=1;i<=n-1;i++) for(int j=1;j<=m;j++) { scanf("%d",&t); add((i-1)*n+j,i*n+j,t); add(i*n+j,(i-1)*n+j,t); } for(int i=1;i<=n-1;i++) for(int j=1;j<=m-1;j++) { scanf("%d",&t); add((i-1)*n+j,i*n+j+1,t); add(i*n+j+1,(i-1)*n+j,t); }*/ int t; long long ans=0; while(bfs()) { while(t=dfs(1,0x7ffffff)) ans+=t; for(int i=1;i<=n;i++) b[i]=0; } cout<<ans<<endl; return 0; } ```
by 星灵王 @ 2018-02-26 14:08:36


本题AC代码 ```cpp #include<cstdio> #include<iostream> using namespace std; long long to[200001],s[200001],last[200001],head[10001],n,m,s1,t4; int a[10001],b[10001],d[10001]; long long p=0; void add(int u,int v,int w) { p++; last[p]=head[u]; s[p]=w; to[p]=v; head[u]=p; } bool bfs() { int hed=0,tail=1; a[1]=s1; b[s1]=1; d[1]=1; while(hed<tail) { hed++; int j=head[a[hed]]; while(j!=0) { if(!b[to[j]]&&s[j]>0) { tail++; a[tail]=to[j]; b[to[j]]=d[tail]=d[hed]+1; } j=last[j]; } } if(b[t4]) return 1; return 0; } int dfs(long long now,long long mint) { if(now==t4||mint<=0) return mint; int j=head[now]; while(j!=0) { int t1; if(b[now]+1==b[to[j]]&&s[j]>0) { t1=dfs(to[j],min(mint,s[j])); if(t1>0) { s[j]-=t1; // s[j^1]+=t1; return t1; } } j=last[j]; } } int main() { long long t1,t2,t3; scanf("%d%d%d%d",&n,&m,&s1,&t4); for(int j=1;j<=m;j++) { scanf("%d%d%d",&t1,&t2,&t3); add(t1,t2,t3); // add(t2,t1,0); } /*add((i-1)*n+j,(i-1)*n+j+1,t); add((i-1)*n+j+1,(i-1)*n+j,t); } for(int i=1;i<=n-1;i++) for(int j=1;j<=m;j++) { scanf("%d",&t); add((i-1)*n+j,i*n+j,t); add(i*n+j,(i-1)*n+j,t); } for(int i=1;i<=n-1;i++) for(int j=1;j<=m-1;j++) { scanf("%d",&t); add((i-1)*n+j,i*n+j+1,t); add(i*n+j+1,(i-1)*n+j,t); }*/ int t; long long ans=0; while(bfs()) { while(t=dfs(s1,0x7ffffff)) ans+=t; for(int i=1;i<=n;i++) b[i]=0; } cout<<ans<<endl; return 0; } ```
by 星灵王 @ 2018-02-26 14:09:12


哪位大佬可以解释一下
by 星灵王 @ 2018-02-26 14:09:28


建议您去Loj.ac的101提交一下 洛谷这类模板的数据普遍很水
by Flaranis @ 2018-02-26 14:16:00


但是我加了反向边过了呀。。。
by 小可爱三岁七 @ 2018-02-26 15:27:09


AC代码:
by 小可爱三岁七 @ 2018-02-26 15:27:26


不对。。。。好像就是不用加反向边233....
by 小可爱三岁七 @ 2018-02-26 15:28:54


@[星灵王stark](/space/show?uid=38031) 您建边应该从0或2``` ``` if(t1>0) { s[j]-=t1; s[j^1]+=t1; return t1; } ``` 开始建吧。。。 这样好对应反向边 j^1对应j的反向边。。。 您这种建边方式j^1对应下一条边。。。
by Dispwnl @ 2018-02-26 16:38:48


知道了,谢谢大佬
by 星灵王 @ 2018-02-27 13:07:13


嗯 数据太水 所以还是要加反向边 emmmmmmmm
by Aoki_灏 @ 2018-03-24 16:21:42


| 下一页