生活随笔
收集整理的這篇文章主要介紹了
最大流
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<span?style="font-size:14px;">#define?N?10000??? int?n,m,len,s,t;?? struct?node{?? ????int?x,y,e,pre;?? };?? node?a[N*2];?? int?pre[N],que[N],stage[N];?? ?? void?init()?? {?? ????len=0;?s=0;?t=m+n+1;//s和t自己改的?? ????memset(pre,-1,sizeof(pre));?? }?? void?addpage(int?x,int?y,int?t)?? {?? ????a[len].x=x;a[len].y=y;a[len].e=t;?? ????a[len].pre=pre[x];pre[x]=len++;?? }?? bool?bfs()?? {?? ????queue<int>q;?? ????memset(stage,-1,sizeof(stage));?? ????stage[s]=0;?q.push(s);?? ????while(!q.empty())?? ????{?? ????????int?x=q.front();?q.pop();?? ????????for(int?i=pre[x];?i!=-1;?i=a[i].pre)?? ????????????if(a[i].e>0?&&?stage[a[i].y]==-1)?? ????????????{?? ????????????????stage[a[i].y]=stage[a[i].x]+1;?? ????????????????q.push(a[i].y);?? ????????????????if(a[i].y==t)?return?true;?? ????????????}?? ????}?? ????return?false;?? }?? int?dfs()?? {?? ????int?sum=0;?? ????while(bfs())?? ????{?? ????????int?tail=0,u=s;?? ????????while(true)?? ????????{?? ????????????if(u==t)?? ????????????{?? ????????????????int?Min=inf,mark;?? ????????????????rep(i,tail)?? ????????????????????if(a[que[i]].e<Min)?? ????????????????????????mark=i,Min=a[que[i]].e;?? ????????????????rep(i,tail)?? ????????????????????a[que[i]].e-=Min,a[que[i]^1].e+=Min;?? ????????????????sum+=Min,tail=mark,u=a[que[tail]].x;?? ????????????}?? ????????????int?i;?? ????????????for(?i=pre[u];?i!=-1;?i=a[i].pre)?? ????????????{?? ????????????????int?y=a[i].y;?? ????????????????if(stage[y]==-1)?continue;?? ????????????????if(stage[y]==stage[u]+1?&&?a[i].e>0)?break;?? ????????????}?? ????????????if(i!=-1)//回朔?? ????????????????que[tail++]=i,u=a[i].y;?? ????????????else?? ????????????{?? ????????????????if(tail==0)?break;?? ????????????????stage[u]=-1;?? ????????????????u=a[que[--tail]].x;?? ????????????}?? ????????}?? ????}?? ????return?sum;?? }?? int?main()?? {??? ????init();?? ????//加正反邊?? ????return?dfs();?? ???return?0;?? }</span>??
總結
以上是生活随笔為你收集整理的最大流的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。