Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1584981
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类:

2009-12-03 11:08:46

#include
using namespace std;
typedef int path[200];
int map[200][200];
int ek(int src,int sink, int n)
{
    int i,j,total;
    if(src == sink)
        return INT_MAX;
    path prev,visit,flow;
    while(true)    
    {
        //去掉所有标记
        for(i=0;i        {
            pre[i]=-1;
            flow[i]=0; //从源点到i最多可以增加的流量
            visit[i] = false;
        }
        flow[src]= INT_MAX;
        //找一条路径
        while(true)
        {
            maxflow =0;
            maxnode=-1;
            //每次都找下一层的最大边
            for(i=0;i                if(flow(i)>maxflow && !visit[i])
                {
                    maxflow = flow[i]; //从src到i的最大增量
                    maxnode = i;
                }
            if(-1 == maxnode || maxnode == sink)
                break;
            visit[maxnode]=true;
            //对maxnode的所有相邻节点作标记,想借此找出此路径上最小的增量,其实可以不标,直接搜一遍这个路径即可,只不过想一遍完而已
            for(j=0;j            {
                if(flow[j] < min(maxflow, map[maxnode][j]) )
                {
                    pre[j]  = maxnode;
                    flow[j] = min(maxflow,map[maxnode][j]); //表明j的增不会超前趋的增
                }
            }
        }
        //寻路结束
        if(maxnode == -1) //no path
            break;
        increment = flow[sink]; //标记法的好处,此路径上从源点到汇点的最大增量
        total+=increment;
        k = sink;
        while(k!=src)
        {
            i = pre[k];
            map[i][k]-=increment;   //更新残余网络
            map[k][i]+=increment;
            k = i;
        }
    }
    return total;
}
阅读(1055) | 评论(0) | 转发(0) |
0

上一篇:vim缩进

下一篇:马的走法

给主人留下些什么吧!~~