• COJ1249(竞争性酶抑制剂和同工酶)


    题目链接

    由于之前没写过网络流方面的题目,所以第一次写的时候居然想到用动态规划去做(在没有环的情况下貌似可以,有环会RE)。现在看来,这题是个求最小割的题,因为最大流量最小割相等,所以也就是求最大流量。容量网络也很明显。我用的是标号法(Edmonds-Karp算法)。

    #include <stdio.h>
    #include <string.h>
    #define N 152
    #define INF 0x7fffffff
    #define MIN(a,b) ((a)<(b)?(a):(b))
    int c[N][N],flow[N][N],a[N],p[N],f,n,m;
    int queue[N],front,rear;
    void EK(int s,int t)
    {
        int u,v;
        f=0;
        memset(flow,0,sizeof(flow));
        while(1)
        {
            memset(a,0,sizeof(a));
            front=rear=0;
            queue[rear]=s,rear=(rear+1)%N;
            a[s]=INF,p[s]=0;
            while(rear!=front)
            {
                u=queue[front],front=(front+1)%N;
                for(v=1;v<=n;v++)
                {
                    if(!a[v]&&c[u][v]>flow[u][v])
                    {
                        a[v]=MIN(a[u],c[u][v]-flow[u][v]);
                        p[v]=u;
                        queue[rear]=v,rear=(rear+1)%N;
                    }
                }
            }
            if(!a[t])   break;
            for(u=t;u!=s;u=p[u])
            {
                flow[p[u]][u]+=a[t];
                flow[u][p[u]]-=a[t];
            }
            f+=a[t];
        }
    }
    int main()
    {
        int i,x,y,z,s,t;
        while(~scanf("%d%d",&n,&m))
        {
            memset(c,0,sizeof(c));
            for(i=0;i<m;i++)
            {
                scanf("%d%d%d",&x,&y,&z);
                c[x][y]+=z;
            }
            scanf("%d%d",&s,&t);
            EK(s,t);
            printf("%d\n",f);
        }
        return 0;
    }
    
  • 相关阅读:
    MVC 和 MVVM
    Objective-C对象模型及应用
    面试总汇二
    iOS中常用的四种数据持久化方法简介
    iOS应用程序生命周期
    SDWebImage的总结
    面试知识点总汇
    block 的演练和使用
    Java 类 生成数据库表
    sql中写标量函数生成大写拼音首字母
  • 原文地址:https://www.cnblogs.com/algorithms/p/2439768.html
Copyright © 2020-2023  润新知