(グレート!)poj3469デュアルコアCPU

最小割

複雑さ:ネットワークの1E5、理論の複雑さにdinic、実行1E4 \((N ^ 2メートル)\ )

オブジェクトを探していると、二組の一般的な最小コストの最小カットに分かれますが、問題は、マップを構築するために困難ですさ

  1. 全体ではなく、グラフ、ユニコム、 - 各モジュールは、A、Bのいずれかで、それは、T Sであり、さらに各点に対するエッジ片側を切断ではなく、あまりにも多く、最小カットの条件に沿ったものであるしなければならないのいずれかであるので余分なエッジをカットしないでください
  2. そして、ので、A、B及びAに属する2つのセットの場合、Bは側面を有し、被験者が必要とされない中国ユニコムを確保するために辺、SとTとの間の必要A、Bを切断しました
#include<queue>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;

#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define add_e(u,v,w) add(u,v,w),add(v,u,0)

const int inf=0x3f3f3f3f,N=20000+10,s=0,t=20001;

int n,m,cnt=0,head[N],d[N];
struct edge{
    int nxt,v,w;
}e[N*50];
queue<int>q;

void add(int u,int v,int w){
    e[cnt]=(edge){head[u],v,w};
    head[u]=cnt++;
}

inline void read(int &x){
    x=0;char f=1,c=getchar();
    while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); }
    while(isdigit(c)){ x=x*10+c-'0'; c=getchar(); }
    x*=f;
}

bool bfs(){
    while(!q.empty()) q.pop();
    mem(d,0);
    d[s]=1;q.push(s);
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int i=head[u];i+1;i=e[i].nxt){
            int v=e[i].v;
            if(!e[i].w||d[v]) continue;
            d[v]=d[u]+1;
            if(v==t) return 1;
            q.push(v);
        }
    }
    return 0;
}

int dinic(int u,int low){
    if(u==t) return low;
    int res=low,f;
    for(int i=head[u];i+1&&res;i=e[i].nxt){
        int v=e[i].v;
        if(d[v]==d[u]+1&&e[i].w){
            f=dinic(v,min(res,e[i].w));
            if(!f) d[v]=0;
            e[i].w-=f;e[i^1].w+=f;
            res-=f;
        }
    }
    return low-res;
}

int main(){
    mem(head,-1);
    //freopen("input.txt","r",stdin);
    read(n),read(m);
    int x,y,w;
    go(i,1,n){
        read(x),read(y);
        add_e(s,i,x);
        add_e(i,t,y);
    }
    go(i,1,m){
        read(x),read(y),read(w);
        add_e(x,y,w);
        add_e(y,x,w);
    }
    int ans=0;
    while(bfs()) ans+=dinic(s,inf);
    cout<<ans;
    return 0;
}

おすすめ

転載: www.cnblogs.com/White-star/p/11454263.html