Dinic模版+SAP模版

来源:互联网 发布:csgo显卡优化 编辑:程序博客网 时间:2024/05/17 07:16

我的板qwq 好像常数要大一些..

bool bfs(){    int u,v;    memset(h,-1,sizeof(h));    queue<int> q;    h[1]=0;    q.push(1);    while(!q.empty()){        u =  q.front();q.pop();        for(int i=head[u];~i;i=e[i].next){            v = e[i].to;            if(e[i].cap>0&&(!~h[v])){                h[v]=h[u]+1;                q.push(v);            }        }    }    return ~h[n*m]?true:false;}int dfs(int u,int f){    if(u==n*m)return f;    int tmp,v;    for(int i=head[u];~i;i=e[i].next){        v=e[i].to;        if(e[i].cap>0&&h[v]==h[u]+1){            tmp=dfs(v,min(f,e[i].cap));            if(tmp>0){                e[i].cap-=tmp;                e[i^1].cap+=tmp;                return tmp;            }        }               }    h[u]=-1;    return 0;}void dinic(){    while(bfs()){        ans+=dfs(1,INF);    }}

黄学长的板qwq
(向黄学长低头orz。)

bool bfs(){    int now,i;    memset(h,-1,sizeof(h));    int t=0,w=1;    q[t]=1;h[1]=0;    while(t<w)    {           now=q[t];t++;        i=head[now];        while(i)        {            if(e[i].v&&h[e[i].to]<0)            {                q[w++]=e[i].to;                h[e[i].to]=h[now]+1;                             }            i=e[i].next;        }    }    if(h[n*m]==-1)return 0;    return 1;}int dfs(int x,int f){    if(x==n*m)return f;    int i=head[x];    int w,used=0;    while(i)    {        if(e[i].cap&&h[e[i].to]==h[x]+1)        {            w=f-used;            w=dfs(e[i].to,min(w,e[i].cap));            e[i].cap-=w;            e[i+1].cap+=w;            used+=w;            if(used==f)return f;        }        i=e[i].next;    }    if(!used)h[x]=-1;    return used;}void dinic(){    while(bfs()){        ans+=dfs(1,INF);    }}

神大的学长给的SAP板

    int dfs(int x,int flow){          if(x==T) return flow;          int tmp=res=0;          for(int i=last[x];i;i=next[i]) if (d[x]==d[v[i]]+1 && w[i]>0){              last[x]=i;              tmp=dfs(v[i],min(flow-res,w[i]);              res+=tmp;w[i]-=tmp;w[i^1]+=tmp;              if (res==flow) return flow;          }          if (d[1]>=n) return res;          vd[d[x]]--; if (vd[d[x]]==0) d[1]=n;          d[x]++;vd[d[x]]++;          last[x]=top[x];              return res;      }      int SAP{          memset(d,0,sizeof(d));          memset(vd,0,sizeof(vd);          for (int i=1;i<=n;i++) last[i]=top[i];          int ans=0;          while (d[1]<n) ans+=dfs(S,1e9);          return ans;      }  
1 0