最小コストの最大の流れのために、私たちは長い時間前に学んできましたが、覚えていない予見されています。
それは再審査に今日そう。
より効率的な場合があります最小コストの最大の流れについて、私は疑問にされている、私は知りません。
以下は、単に最小コスト最大フローの基本的な操作を概説することです。
この質問のために、モデリングは難しいことではない-だけで超超ソースを作成する必要があるとシンクが可能。
スーパー超シンクに図源の添加は、容量とに接続されている。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;
}