标签:Beijing head return val int rest ICPC add 2006
题面
很容易看出来是最小割,然后打出模板后发现答案错了(甚至建边都是x->y,我佛了看了半天),一看题解才知道无向图不一样,建图反向边权值也是val,虽然不知道为啥,不过说的是本来就可以增广
记住就行????
#include<bits/stdc++.h> using namespace std; const int maxn=1000005; const int maxm=6000005; int n,m; int s,t; int cnt=1,head[maxn]; struct edge{ int x,y,val,next; }e[maxm]; void add(int x,int y,int val){ e[++cnt]=(edge){x,y,val,head[x]}; head[x]=cnt; } void add_edge(int x,int y,int val){ add(x,y,val); add(y,x,val); } int d[maxn]; bool bfs(){ queue<int> q; memset(d,0,sizeof(d)); q.push(s);d[s]=1; while(!q.empty()){ int x=q.front(); q.pop(); for(int i=head[x];i;i=e[i].next){ int y=e[i].y; if(e[i].val&&!d[y]){ d[y]=d[x]+1; q.push(y); if(y==t) return true; } } } return false; } int dfs(int x,int flow){ if(x==t) return flow; int rest=flow,k; for(int i=head[x];i;i=e[i].next){ int y=e[i].y; if(e[i].val&&d[y]==d[x]+1){ k=dfs(y,min(rest,e[i].val)); if(!k) {d[y]=0;continue;} e[i].val-=k; e[i^1].val+=k; rest-=k; if(!rest) break; } } return flow-rest; } int dinic(){ int ret=0; while(bfs()) ret+=dfs(s,0x3f3f3f); return ret; } int main(){ scanf("%d%d",&n,&m); s=1;t=n*m; for(int i=1;i<=n;i++) for(int j=1;j<m;j++){ int val; scanf("%d",&val); add_edge((i-1)*m+j,(i-1)*m+j+1,val); } for(int i=1;i<n;i++) for(int j=1;j<=m;j++){ int val; scanf("%d",&val); add_edge((i-1)*m+j,i*m+j,val); } for(int i=1;i<n;i++) for(int j=1;j<m;j++){ int val; scanf("%d",&val); add_edge((i-1)*m+j,i*m+j+1,val); } printf("%d",dinic()); }狼抓兔子
标签:Beijing,head,return,val,int,rest,ICPC,add,2006 来源: https://www.cnblogs.com/sto324/p/11426395.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。