设为首页 加入收藏

TOP

网络流初步: 最大流
2015-07-24 05:33:35 来源: 作者: 【 】 浏览:5
Tags:网络 初步 最大

好吧。。

直接上模板。。。

思想可以看看这里点击打开链接



 
queue
  
    q;  
memset(flow,0,sizeof(flow));  
int f = 0;  
while(true){  
    memset(a,0,sizeof(a));  
    a[s] = INF;  
    q.push(s);  
    while(!q.empty)){    //BFS找增广路  
        int u = q.front(), q.pop();  
        for(int v = 1; v <= n; v++){  
            if(!a[v] && cap[u][v] > flow[u][v]){   //找到新结点  
                a[v] = (a[u]
   
    
Edmond Karp算法具体实现(C/C++)
#include 
     
      
#include 
      
        #include 
       
         using namespace std; 1 const int msize = 205; int N, M; // N--路径数, M--结点数 int r[msize][msize]; // int pre[msize]; // 记录结点i的前向结点为pre[i] bool vis[msize]; // 记录结点i是否已访问 // 用BFS来判断从结点s到t的路径上是否还有delta // 即判断s,t之间是否还有增广路径,若有,返回1 bool BFS(int s, int t) { queue
        
          que; memset(pre, -1, sizeof(pre)); memset(vis, false, sizeof(vis)); pre[s] = s; vis[s] = true; que.push(s); int p; while(!que.empty()) { p = que.front(); que.pop(); for(int i=1; i<=M; ++i) { if(r[p][i]>0 && !vis[i]) { pre[i] = p; vis[i] = true; if(i == t) // 存在增广路径 return true; que.push(i); } } } return false; } int EK(int s, int t) { int maxflow = 0, d; while(BFS(s, t)) { d= INT_MAX; // 若有增广路径,则找出最小的delta for(int i=t; i!=s; i=pre[i]) d = min(d, r[pre[i]][i]); // 这里是反向边,看讲解 for(int i=t; i!=s; i=pre[i]) { r[pre[i]][i] -= d; r[i][pre[i]] += d; } maxflow += d; } return maxflow; } int main() { while(cin >> N >> M) { memset(r, 0, sizeof(r)); int s, e, c; for(int i=0; i
         
          > s >> e >> c; r[s][e] += c; // 有重边时则加上c } cout << EK(1, M) << endl; } return 0; }
         
        
       
      
     


    
 
    

还有一种是紫书上的。。这个要难些。。。

struct Edge
{
    int from, to, cap, flow;
    Edge (int u, int v, int c, int f):from(u), to(v), cap(c), flow(f) {}
};

struct EdmondsKarp
{
    int n, m;
    vector
      
        edges;
    vector
       
         G[MAXN]; int a[MAXN]; int p[MAXN]; void init(int n) { for(int i=0; i
        
          Q; Q.push(s); a[s]=INF; while( !Q.empty() ) { int x = Q.front(); Q.pop(); for(int i=0; i
         
           e.flow ) { p[e.to] = G[x][i]; a[e.to] = min(a[x], e.cap-e.flow); Q.push(e.to); } } if( a[t] ) break; } if( ! a[t] ) break; for(int u=t; u!=s; u=edges[ p[u] ].from ) { edges[ p[u] ].flow += a[t]; edges[ p[u]^1 ].flow -= a[t]; } flow += a[t]; } return flow; } };
         
        
       
      





还是先弄弄容易的吧。。。那个真的。。Orz。。

第一次尝试可以做HDU1532。。。



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Lua学习笔记4:类及集成的实现 下一篇无效的指针、引用和迭代器

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: