最小コスト最大フロー--poj2135

最小コストの最大の流れのために、私たちは長い時間前に学んできましたが、覚えていない予見されています。
それは再審査に今日そう。
より効率的な場合があります最小コストの最大の流れについて、私は疑問にされている、私は知りません。
以下は、単に最小コスト最大フローの基本的な操作を概説することです。
この質問のために、モデリングは難しいことではない-だけで超超ソースを作成する必要があるとシンクが可能。
スーパー超シンクに図源の添加は、容量とに接続されている。2、0以外の点の正しい値は、無向グラフであり、1の容量(なぜ、と思いますか?)
だから単純なモデルが確立されています。
最小コストの最大値は、最大流量のアプローチのようなビットを流れ、常にパスを増強するために探して、ちょうどこの増強パスが可能に、最短経路を見つけ、その後、常にトラフィックを更新し、最短しようとするトラフィックの場合、最短です。EKはああのようなビット!

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
#define For(aa,bb,cc) for(int aa=bb;aa<=cc;++aa)
#define Set(aa,bb) memset(aa,bb,sizeof(aa))
using namespace std;
const int maxn=1010,maxm=100010,inf=0x3f3f3f3f;
int n,m,s,t;
int st[maxm],be[maxm],to[maxm],w[maxm],ne[maxm],flow[maxm],e;
int edge[maxm],dis[maxn];
bool vis[maxn];

void add(int x,int y,int z,int f){
    st[++e]=x,to[e]=y,ne[e]=be[x],be[x]=e,w[e]=z,flow[e]=f;
    st[++e]=y,to[e]=x,ne[e]=be[y],be[y]=e,w[e]=-z,flow[e]=0;
}

void spfa(){
    Set(dis,inf),Set(vis,0),Set(edge,-1);
    queue<int>q;
    dis[s]=0;
    q.push(s);
    while(!q.empty()){
        int k=q.front();q.pop(),vis[k]=0;
        for(int i=be[k];i!=-1;i=ne[i]){
            int u=to[i];
            if(flow[i] && dis[u]>dis[k]+w[i]){
                dis[u]=dis[k]+w[i];
                edge[u]=i;
                if(!vis[u]){
                    vis[u]=1;
                    q.push(u);
                }
            }
        }
    }
}

void bfs(){
    int ans=0;
    while(1){
        spfa();
        if(edge[t]==-1) break;
        int mine=edge[t];
        while(mine!=-1){
            --flow[mine];
            ++flow[mine^1];
            mine=edge[st[mine]];
        }
        ans+=dis[t];
    }
    printf("%d\n",ans);
}

void work(){
    Set(be,-1);
    e=-1;
    scanf("%d%d",&n,&m);
    For(i,1,m){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z,1);
        add(y,x,z,1);
    }
    s=0,t=n+1;
    add(s,1,0,2),add(n,t,0,2);
    bfs();
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif
    work();
    return 0;
}
公開された51元の記事 ウォンの賞賛6 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq_35776579/article/details/55001383