日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

最小费用最大流总结

發(fā)布時(shí)間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小费用最大流总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最小費(fèi)用最大流

在費(fèi)用流的圖上,邊不僅有流量還有權(quán)值。
最小費(fèi)用最大流就是在最大流不唯一時(shí),求權(quán)值最小的方案,其基本思想就是在最大流的基礎(chǔ)上考慮費(fèi)用最小。解決這種問(wèn)題的操作可以描述為多次迭代的過(guò)程,下面來(lái)介紹解決這種問(wèn)題的一種方法——Spfa增廣。

Spfa增廣

基本思想是:從零流為初始可行流開(kāi)始,在每次迭代過(guò)程中對(duì)每條邊賦予與cap(容量)、w(單位流量運(yùn)輸費(fèi)用)、flow(現(xiàn)有流的流量)有關(guān)的權(quán)數(shù)dis(i,j),形成一個(gè)有向賦權(quán)圖。再用Spfa確定由s到t的費(fèi)用最小的非飽和路,沿著該路增加流量,得到相應(yīng)的新流。經(jīng)過(guò)多次迭代,直至達(dá)到最大流為止。

因?yàn)闆](méi)有找到很好的裸題,所以選了Hdu 2135,一道類(lèi)最短路問(wèn)題。
因?yàn)閺钠瘘c(diǎn)出發(fā)走到終點(diǎn)還要再回起點(diǎn),所以要把起點(diǎn)終點(diǎn)拆掉,建一條容量為2的邊。

#include<cstdio> #include<cstring> #include<algorithm> const int maxn=1005,maxm=40005; int lnk[maxn],son[maxm],fa[maxm],nxt[maxm],cap[maxm],flow[maxm],f[maxm]; int n,m,tot,w[maxm],que[maxn],hed,til,dis[maxn],p[maxn],ans,INF; bool vis[maxn]; void add(int x,int y,int c,int z){nxt[tot]=lnk[x];lnk[x]=tot;fa[tot]=x;son[tot]=y;w[tot]=z;cap[tot]=c;tot++;nxt[tot]=lnk[y];lnk[y]=tot;fa[tot]=y;son[tot]=x;w[tot]=-z;cap[tot]=0;tot++; } int mi(int x,int y){if (x<y) return x;return y;} bool spfa(){memset(vis,0,sizeof(vis));memset(dis,63,sizeof(dis));memset(p,63,sizeof(p));hed=0;til=1;que[1]=0;INF=dis[0];vis[0]=1;dis[0]=0;while (hed!=til){int x=que[hed=(hed+1)%maxn];vis[x]=0;for (int j=lnk[x];j!=-1;j=nxt[j])if (cap[j]>flow[j]&&dis[x]+w[j]<dis[son[j]]){dis[son[j]]=dis[x]+w[j];f[son[j]]=j;p[son[j]]=mi(p[x],cap[j]-flow[j]);if (!vis[son[j]]){que[til=(til+1)%maxn]=son[j];vis[son[j]]=1;}}}if (dis[n+1]==INF) return 0;ans+=dis[n+1]*p[n+1];for (int i=n+1;i;i=fa[f[i]]) flow[f[i]]+=p[n+1],flow[f[i]^1]-=p[n+1];return 1; } int main(){freopen("exam.in","r",stdin);freopen("exam.out","w",stdout);memset(lnk,255,sizeof(lnk));scanf("%d%d",&n,&m);add(0,1,2,0);add(n,n+1,2,0);while (m--){int x,y,z;scanf("%d%d%d",&x,&y,&z);add(x,y,1,z);add(y,x,1,z);}while (spfa());printf("%d\n",ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的最小费用最大流总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。