Dinic算法(最大流)

    xiaoxiao2021-04-17  33

    bool bfs(int s,int t) //分层 { int i; memset(len,-1,sizeof(len)); queue<int>que; que.push(s); len[s]=0; while(!que.empty()) { int u=que.front(); que.pop(); for(i=0;i<=t;i++) { if(map[u][i]>0 && len[i]<0) { len[i]=len[u]+1; que.push(i); } } } if(len[t]>-1) return true; return false; } int dfs(int u,int t,int f) //寻找增广路 { if(u==t) return f; for(int &i=pos[u];i<=t;i++) //注意该处的引用,意思就是从上次遍历过的地方开始 { if(map[u][i]>0 && len[u]<len[i]) { int d=dfs(i,t,min(map[u][i],f)); if(d>0) { map[u][i]-=d; map[i][u]+=d; return d; } } } return 0; } int max_flow(int s,int t) { int res=0; while(bfs(s,t)) { memset(pos,0,sizeof(pos)); while(1) { int d=dfs(s,t,99999); if(d<=0) break; res+=d; } } return res; }
    转载请注明原文地址: https://ju.6miu.com/read-674200.html

    最新回复(0)