zoukankan      html  css  js  c++  java
  • 【网络流量最大流量】poj3281Dining

    /*
    EK算法版本号,哦,慢。。。。。见下文dinic版本号
    -----------------------------------------
    最大的问题是网络流量问题
    ----------------------------------------
    建图:
    关键:拆点
    把每一个牛拆成两个点,牛作为一个点有流量限制,即每一头牛仅仅能的一份饭。
    把牛拆开后,将边的权值赋值为1。
    ----------------------------------------
    建好图后就能够EK算法最大流了
    ----------------------------------------
    建图代码:
    for(int i=1; i<=f; i++)源点和food相连
        g[s][i] = 1;
    for(int i=1; i<=d; i++)drink和汇点相连
        g[i + 2*n + f][t] = 1;
    for(int i=1; i<=n; i++)
    {
        cin>>a>>b;
        for(int j=1; j<=a; j++)
        {
            cin>>food;
            g[food][f + i] = 1;food和牛相连
        }
        g[f + i][f + i + n] = 1;牛拆点后也要相连
        for(int j=1; j<=b; j++)
        {
            cin>>drink;
            g[f + i + n][2*n + f + drink] = 1;牛和drink相连
        }
    }
    ---------------------------------
    */
    #include <iostream>
    #include <cstdio>
    #include <queue>
    #include <cstring>
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    const int N = 500;
    
    int n,f,d;
    int g[N][N];
    int flow[N][N],a[N],p[N];
    int s,t;
    
    int EK(int s, int t)
    {
        queue<int> q;
        int f = 0;
        for(;;)
        {
            memset(a,0,sizeof(a));
            a[s] = INF;
            q.push(s);
            while(!q.empty())
            {
                int u = q.front();
                q.pop();
                for(int v=s; v<=t; v++)
                {
                    if(!a[v] && g[u][v] > flow[u][v])
                    {
                        p[v] = u;
                        q.push(v);
                        a[v] = min(a[u],g[u][v] - flow[u][v]);
                    }
                }
            }
            if(a[t] == 0)
                break;
            for(int u=t; u != s; u=p[u])
            {
                flow[p[u]][u] += a[t];
                flow[u][p[u]] -= a[t];
            }
            f += a[t];
        }
        return f;
    }
    
    void init()
    {
        int a,b,food,drink;
        s = 0;
        t = 2*n + f + d + 1;
        memset(g,0,sizeof(g));
        for(int i=1; i<=f; i++)
            g[s][i] = 1;
        for(int i=1; i<=d; i++)
            g[i + 2*n + f][t] = 1;
        for(int i=1; i<=n; i++)
        {
            cin>>a>>b;
            for(int j=1; j<=a; j++)
            {
                cin>>food;
                g[food][f + i] = 1;
            }
            g[f + i][f + i + n] = 1;
            for(int j=1; j<=b; j++)
            {
                cin>>drink;
                g[f + i + n][2*n + f + drink] = 1;
            }
        }
    }
    
    int main()
    {
        //freopen("input.txt","r",stdin);
        while(scanf("%d%d%d",&n,&f,&d) != EOF)
        {
            init();
            printf("%d
    ",EK(s, t));
        }
        return 0;
    }
    

    --------------------------------------------------------------------

    战斗,不留情面;斗争。永不停止~~~~~~~~~~~~~~

  • 相关阅读:
    linux mail 简操作
    数据挖掘-概念与技术-第10章聚类作业题
    机器学习实战 -> 无监督学习
    机器学习实战 -> 利用PCA&&SVD来简化数据
    贪婪算法
    统计学习方法 –> 支持向量机
    统计学习方法 –> 逻辑死地回归与最大熵模型
    最优二叉搜索树
    动态规划
    统计学习方法–> 决策树
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5033918.html
Copyright © 2011-2022 走看看