设为首页 收藏本站
查看: 760|回复: 0

[经验分享] pku 1459 最大流 SAP

[复制链接]

尚未签到

发表于 2015-9-19 07:22:03 | 显示全部楼层 |阅读模式
  




#include <iostream>
#include <queue>
#define msize 205 //最大顶点数目
//#define INT_MAX 100000000
using namespace std;
int d[msize];           //标号
int r[msize][msize];    //残留网络,初始为原图
int num[msize];         //num表示标号为i的顶点数有多少
int pre[msize];
int n,m;  //m个顶点,n条边,从源点s到汇点t
int min(int a,int b)
{
    if(a<b) return a;
    else return b;
}
void init(int s,int t) //BFS计算标号,汇点t标号为0
{
    int k;
    queue<int>Q;
    memset(d,1,sizeof(d));
    memset(num,0,sizeof(num));
    Q.push(t);
    d[t]=0;
    num[0]=1;
    while (!Q.empty())
    {
        k=Q.front(),Q.pop();
        for (int i=0;i<n+2;i++)
        {
            if (d>=n+2&&r[k]>0)
            {
                d=d[k]+1;
                Q.push(i);
                num[d]++;
            }
        }
    }
}
int findAlowArc(int i)       //从i出发寻找允许弧
{
    int j;
    for (j=0;j<n+2;j++) if (r[j]>0&&d==d[j]+1) return j;
    return -1;
}
int reLable(int i)         //重新标号
{
    int mm=INT_MAX;
    for (int j=0;j<n+2;j++)
        if (r[j]>0) mm=min(mm,d[j]+1);
    return mm==INT_MAX?(n):mm;
}
int maxFlow(int s,int t)      //从源点s出发的最大流
{
    int flow=0,i=s,j;
    int delta;              //增量
    memset(pre,-1,sizeof(pre));
    while (d<n+2)
    {
        j=findAlowArc(i);
        if (j>=0)
        {
            pre[j]=i;
            i=j;
            if (i==t)           //更新残留网络
            {
                delta=INT_MAX;
                for (i=t;i!=s;i=pre) delta=min(delta,r[pre]);
                for (i=t;i!=s;i=pre) r[pre] -= delta, r[pre] += delta;
                flow += delta;
            }
        }
        else
        {
            int x=reLable(i);       //重新标号
            num[x]++;
            num[d]--;
            if (num[d]==0) return flow;      //间隙优化
            d=x;
            if (i!=s) i=pre;
        }
    }
    return flow;
}
int main()
{
    int i,j,k;
    int np,nc;
    int a,b,z;
    while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF)
    {
        memset(r,0,sizeof(r));
        for(i=1;i<=m;i++)
        {
            scanf(" (%d,%d)%d",&a,&b,&z);
            r[a]=z;
        }
        for(i=1;i<=np;i++)
        {
            scanf(" (%d)%d",&a,&z);
            r[n][a]=z;
        }
        for(i=1;i<=nc;i++)
        {
            scanf(" (%d)%d",&a,&z);
            r[a][n+1]=z;
        }
        init(n,n+1);
        printf("%d\n",maxFlow(n,n+1));
    }
    return 0;
}
  http://blog.chinaunix.net/u3/102624/showart_2064077.html     参考模板

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-115557-1-1.html 上篇帖子: C#通过com端口获取sap数据(sharepoint) 下篇帖子: [转]SAP常用函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表