zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    HDU 4069 Squiggly Sudoku
    SPOJ 1771 Yet Another NQueen Problem
    POJ 3469 Dual Core CPU
    CF 118E Bertown roads
    URAL 1664 Pipeline Transportation
    POJ 3076 Sudoku
    UVA 10330 Power Transmission
    HDU 1426 Sudoku Killer
    POJ 3074 Sudoku
    HDU 3315 My Brute
  • 原文地址:https://www.cnblogs.com/SfailSth/p/6344762.html
Copyright © 2011-2022 走看看