Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5493641
  • 博文数量: 922
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11226
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(922)

文章存档

2023年(1)

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类: C/C++

2008-10-02 19:10:14

很明显的网络最大流问题,我用的是Edmonds-Karp算法实现的。
Edmonds-Karp 算法步骤

每次通过BFS,找到残余网络上从源点到汇点的一条最短增广路

在流网络上增加增广路

修改残余网络,残余容量减去增广路,并添加增广路的反向弧

当无法BFS到增广路时,算法结束

USER: CmYkRgB CmYkRgB [cmykrgb1]
TASK: ditch
LANG: C++
//对ford 算法的改进,变为多项试的。
 

/*
ID: cmykrgb1
PROG: ditch
LANG: C++
*/

#include <iostream>
#include <fstream>
#define MAX 201
using namespace std;
  
class Tadjl
{
public:
    class Tnode
    {
    public:
        int r,v;
        void set(int tr,int tv)
        {
            r=tr;
            v=tv;
        }
    };
    int cnt;
    Tnode link[MAX];
};
  
class tQueue
{
public:
    class linklist
    {
    public:
        linklist* next;
        int value;
        linklist()
        {
            next=0;
            value=0;
        }
    };
    linklist *first,*last;
    int size;
    void add(int p)
    {
        if (size==0)
            first=last=new linklist;
        else
            last=last->next=new linklist;
        last->value=p;
        size++;
    }
    int del()
    {
        int rtn=first->value;
        linklist *tfirst=first;
        first=first->next;
        delete tfirst;
        size--;
        return rtn;
    }
    void reset()
    {
        size=0;
        first=last=0;
    }
    tQueue()
    {
        reset();
    }
};
  
ifstream fi("ditch.in");
ofstream fo("ditch.out");
  
Tadjl adjl[MAX];
int N,M,ans;
  
inline int min(int a,int b)
{
    return a<b?a:b;
}
  
void init()
{
    int i,a,b,v;
    fi >> N >> M;
    for (i=1;i<=N;i++)
    {
        fi >> a >> b >> v;
        adjl[a].link[ ++adjl[a].cnt].set(b,v);
    }
}
  
  
int edmonds(int start,int end)
{
    int i,j,k;
    int father[MAX],fp[MAX],max[MAX];
    int Maxflow=0;
    memset(father,0,sizeof(father));
    max[start]=0x7FFFFFFF;
    tQueue *Q=new tQueue;
    Q->add(start);
    while (Q->size)
    {
        i=Q->del();
        for (k=1;k<=adjl[i].cnt;k++)
        {
            j=adjl[i].link[k].r;
            if (!adjl[i].link[k].v || j==start) continue;
            if (!father[j])
            {
                father[j]=i;
                fp[j]=k;
                max[j]=min(adjl[i].link[k].v,max[i]);
                if (j==end)
                {
                    Maxflow+=max[j];
                    while (father[j])
                    {
                        adjl[father[j]].link[fp[j]].v-=max[end];
                        adjl[j].link[++adjl[j].cnt].set(father[j],max[j]);
                        j=father[j];
                    }
                    memset(father,0,sizeof(father));
                    Q->reset();
                    Q->add(start);
                    break;
                }
                Q->add(j);
            }
        }
    }
    return Maxflow;
}
  
void print()
{
    fo << ans << endl;
    fi.close();
    fo.close();
}
  
int main()
{
    init();
    ans=edmonds(1,M);
    print();
    return 0;
}

阅读(4165) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~