设为首页 加入收藏

TOP

POJ 2516 Minimum Cost 费用流(一)
2012-11-03 14:39:57 来源: 作者: 【 】 浏览:748
Tags:POJ  2516  Minimum  Cost  费用

    题意:有M个货物供应点,它提供k种货物,有N个商店,这N个商店分别要从货物点订购一定量的这k种物品,每个供应点对这k种货物的供应量不同,每个商店对k种物品的需求量也不同,每个货物供应点向每个商店送不同种货物的单个物品的花费不同,现在给出货物供应点、商店、k种货物、花费间的关系,现在让你针对商店给出的订单,让你决定如何使所有供应点完成订单任务的最小花费,若能完成任务,则输出最小花费,否则输出-1.

    为我的英语拙计啊…到网上找了翻译才看懂太水了。

    第一次写费用流,参考了别人的代码,写了点注释,算是费用流第一A.纪念一下

    贴代码

    [cpp]

    #include <iostream>

    #include <cstdio>

    #include <algorithm>

    #include <string>

    #include <cmath>

    #include <cstring>

    #include <queue>

    #include <set>

    #include <vector>

    #include <stack>

    #include <map>

    #include <iomanip>

    #define PI acos(-1.0)

    #define Max 105

    #define inf 1《28

    #define LL(x) (x《1)

    #define RR(x) (x《1|1)

    using namespace std;

    int c[Max][Max]; //流量限制

    int f[Max][Max];//最大流

    int dis[Max];

    int w[Max][Max];//费用

    bool visit[Max];

    int path[Max];

    int S,T;

    int q[Max*100];

    int spfa()//最短路

    {

    int i,j;

    for(i=0; i<=T; i++)

    dis[i]=inf,path[i]=-1,visit[i]=0;

    dis[S]=0;

    visit[S]=1;

    int num=0,cnt=0;

    q[num++]=S;

    while(num>cnt)

    {

    int temp=q[cnt++];

    visit[temp]=0;

    for(i=1; i<=T; i++)

    if(c[temp][i]>f[temp][i]&&dis[temp]+w[temp][i]<dis[i])

    {

    path[i]=temp;

    dis[i]=dis[temp]+w[temp][i];

    if(!visit[i])

    {

    visit[i]=1;

    q[num++]=i;

    }

    }

    }

    if(path[T]==-1)

    return 0;

    return 1;

    }

    void getMaxflow()//找增广路并调整流量

    {

    while(spfa())

    {

    int maxFlow=inf;

    int pre=T;

    while(path[pre]!=-1)

    {

    maxFlow=min(maxFlow,c[path[pre]][pre]-f[path[pre]][pre]);

    pre=path[pre];

    }

    pre=T;

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇字符串字典顺序比较 下一篇CBuilder高手进阶(一)编写弹出..

评论

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