• POJ 3469 Dual Core CPU ——网络流


    【题目分析】

        构造一个最小割的模型。

        S向每一个点连Ai,每一个点向T连Bi。

        对于每一个限制条件,在i和j之间连一条Cij的双向边即可。

        然后求出最小割就是最少的花费。

        验证最小割的合理性很容易。

    【代码】

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
      
    //#include <map>
    #include <set>
    #include <queue>
    #include <string>
    #include <iostream>
    #include <algorithm>
      
    using namespace std;
      
    #define maxn 50005
    #define ll long long
    #define me 400005
    #define inf 0x3f3f3f3f
    #define F(i,j,k) for (int i=j;i<=k;++i)
    #define D(i,j,k) for (int i=j;i>=k;--i)
      
    void Finout()
    {
        #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    //    freopen("out.txt","w",stdout);
        #endif
    }
      
    int Getint()
    {
        int x=0,f=1; char ch=getchar();
        while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
        while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
    int h[me<<1],to[me<<1],ne[me<<1],fl[me<<1],en=0,S=0,T=me-1;
       
    void add(int a,int b,int c)
    {
        to[en]=b; ne[en]=h[a]; fl[en]=c; h[a]=en++;
    //    to[en]=a; ne[en]=h[b]; fl[en]=0; h[b]=en++;
    }
     
    int map[me];
       
    bool tell()
    {
        queue <int> q;
        memset(map,-1,sizeof map);
        map[S]=0;
        while (!q.empty()) q.pop();
        q.push(S);
        while (!q.empty())
        {
            int x=q.front(); q.pop();
            for (int i=h[x];i>=0;i=ne[i])
            {
                if (map[to[i]]==-1&&fl[i]>0)
                {
                    map[to[i]]=map[x]+1;
                    q.push(to[i]);
                }
            }
        }
        if (map[T]!=-1) return true;
        return false;
    }
       
    int zeng(int k,int r)
    {
        if (k==T) return r;
        int ret=0;
        for (int i=h[k];i>=0&&ret<r;i=ne[i])
            if (map[to[i]]==map[k]+1&&fl[i]>0)
            {
                int tmp=zeng(to[i],min(fl[i],r-ret));
                ret+=tmp; fl[i]-=tmp; fl[i^1]+=tmp;
            }
        if (!ret) map[k]=-1;
        return ret;
    }
     
    int main()
    {
        memset(h,-1,sizeof h);
        Finout();
        int n,m,a,b,c;
        n=Getint();m=Getint();
        F(i,1,n)
        {
            a=Getint(); b=Getint();
            add(S,i,a);
            add(i,S,0);
            add(i,T,b);
            add(T,i,0);
        }
        F(i,1,m)
        {
            a=Getint(); b=Getint();
            c=Getint();
            add(a,b,c);
            add(b,a,c);
        }
        int ans=0,tmp;
        while (tell()) while (tmp=zeng(S,inf)) ans+=tmp;
        cout<<ans<<endl;
    }
    

      

  • 相关阅读:
    浅谈Javascript数据属性与访问器属性
    深入浅析JavaScript中的constructor
    javascript 继承
    很认真的聊一聊程序员的自我修养
    JavaScript数据属性与访问器属性
    Js中的数据属性和访问器属性
    [javascript基础]constructor与prototype
    C# System.Net.Mail
    Execl (转)导入导出execl 全
    delegate 委托方法
  • 原文地址:https://www.cnblogs.com/SfailSth/p/6344762.html
Copyright © 2020-2023  润新知