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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 2516 最小费用最大流

發布時間:2025/6/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 2516 最小费用最大流 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 最佳匹配的題,m個倉庫供應k種商品給n個商家,m*n條運輸代價互異,求滿足商家需求下的最小運輸費用?
  • 顯然,如果某種商品的供貨量比需求大,肯定是無法達到要求的,所以開始要判別是否可以得到最佳匹配?
  • ?
  • 這個題非常有啟發意義,剛開始把k種商品一并考慮,tle了,想來也是,這樣X集合中的點為m*k,Y中集合為n*k;?
  • 執行最小費用流這個復雜度為O(n^3)的算法在這個題目是不可以行的?
  • 考慮到k種商品是相互獨立的,所以見k次圖,每次圖中的點為n+m+2個,這樣就可以在時限內出答案了?
  • */??
  • #include?<stdio.h>??
  • #include?<iostream>??
  • #include?<string.h>??
  • #include<queue>??
  • #include<cmath>??
  • using?namespace?std;??
  • const?int?M=5010,ME=5000000;??
  • const?int?INF=0x3f3fffff;??
  • //******************************??
  • int?Head[M],Next[ME],Num[ME],Flow[ME],Cap[ME],Cost[ME],Q[M],InQ[M],Len[M],pre_edge[M];??
  • class?MaxFlow??
  • {??
  • public:??
  • ????void?clear()??
  • ????{??
  • ????????memset(Head,-1,sizeof(Head));??
  • ????????memset(Flow,0,sizeof(Flow));??
  • ????}??
  • ????void?addedge(int?u,int?v,int?cap,int?cost)??
  • ????{??
  • ????????Next[top]?=?Head[u];??
  • ????????Num[top]?=?v;??
  • ????????Cap[top]?=?cap;??
  • ????????Cost[top]?=?cost;??
  • ????????Head[u]?=?top++;??
  • ???
  • ????????Next[top]?=?Head[v];??
  • ????????Num[top]?=?u;??
  • ????????Cap[top]?=?0;??
  • ????????Cost[top]?=?-cost;??
  • ????????Head[v]?=?top++;??
  • ????}??
  • ????int?solve(int?s,int?t)?//返回最終的cost??
  • ????{??
  • ????????int?cost?=?0;??
  • ????????while(SPFA(s,t))??
  • ????????{??
  • ????????????int?cur?=?t,minflow?=?INF;??
  • ????????????while(cur?!=?s)??
  • ????????????{??
  • ????????????????if(minflow?>?Cap[pre_edge[cur]]-Flow[pre_edge[cur]])??
  • ????????????????????minflow?=?Cap[pre_edge[cur]]-Flow[pre_edge[cur]];??
  • ????????????????cur?=?Num[pre_edge[cur]?^?1];??
  • ????????????}??
  • ????????????cur?=?t?;??
  • ????????????while(cur?!=?s)??
  • ????????????{??
  • ????????????????Flow[pre_edge[cur]]?+=?minflow;??
  • ????????????????Flow[pre_edge[cur]?^?1]?-=?minflow;??
  • ????????????????cost?+=?minflow?*?Cost[pre_edge[cur]];??
  • ????????????????cur?=?Num[pre_edge[cur]?^?1];??
  • ????????????}??
  • ????????}??
  • ????????return?cost;??
  • ????}??
  • private:??
  • ????bool?SPFA(int?s,int?t)??
  • ????{??
  • ????????fill(Len,Len+M,INF);??
  • ????????Len[s]=0;??
  • ????????int?head?=?-1,tail?=?-1,cur;??
  • ????????Q[++head]?=?s;??
  • ????????while(head?!=?tail)??
  • ????????{??
  • ????????????++tail;??
  • ????????????if(tail?>=?M)?tail?=?0?;??
  • ????????????cur?=?Q[tail];??
  • ????????????for(int?i?=?Head[cur];i?!=?-1;i?=?Next[i])??
  • ????????????{??
  • ????????????????if(Cap[i]>Flow[i]?&&?Len[Num[i]]?>?Len[cur]?+?Cost[i])??
  • ????????????????{??
  • ????????????????????Len[Num[i]]?=?Len[cur]?+?Cost[i];??
  • ????????????????????pre_edge[Num[i]]?=?i;??
  • ????????????????????if(!InQ[Num[i]])??
  • ????????????????????{??
  • ????????????????????????InQ[Num[i]]=true;??
  • ????????????????????????++head;??
  • ????????????????????????if(head?>=?M)?head?=?0;??
  • ????????????????????????Q[head]?=?Num[i];??
  • ????????????????????}??
  • ????????????????}??
  • ????????????}??
  • ????????????InQ[cur]=false;??
  • ????????}??
  • ????????return?Len[t]?!=?INF;??
  • ????}??
  • ????int?top;??
  • }my;??
  • //******************************??
  • int?need[55][55],canneed[55];??
  • int?suply[55][55],cansuply[55];??
  • int?trans[55][55][55];??
  • int?main()??
  • {??
  • ????int?n,m,k;??
  • ????while(scanf("%d%d%d",&n,&m,&k),n+m+k)??
  • ????{??
  • ????????memset(canneed,0,sizeof(canneed));??
  • ????????memset(cansuply,0,sizeof(cansuply));??
  • ????????for(int?i=1;i<=n;i++)??
  • ????????{??
  • ????????????for(int?j=1;j<=k;j++)??
  • ????????????{??
  • ????????????scanf("%d",&need[i][j]);??
  • ????????????canneed[j]+=need[i][j];//?第i個客戶j商品的訂貨量??
  • ????????????}??
  • ????????}??
  • ????????for(int?i=1;i<=m;i++)??
  • ????????{??
  • ????????????for(int?j=1;j<=k;j++)??
  • ????????????{??
  • ????????????scanf("%d",&suply[i][j]);??
  • ????????????cansuply[j]+=suply[i][j];//第i個倉庫提供的j商品的量??
  • ????????????}??
  • ????????}??
  • ????????for(int?i=1;i<=k;i++)??
  • ????????{??
  • ????????????for(int?j=1;j<=n;j++)??
  • ????????????{??
  • ????????????????for(int?f=1;f<=m;f++)??
  • ????????????????{??
  • ????????????????????scanf("%d",&trans[i][j][f]);//把單位商品i從倉庫f運到商戶j所需的費用??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????????int?flag=1;??
  • ????????for(int?i=1;i<=k;i++)??
  • ????????if(cansuply[i]<canneed[i])??
  • ????????{??
  • ????????????flag=0;??
  • ????????????break;??
  • ????????}??
  • ????????if(!flag){puts("-1");continue;}??
  • ????????int?ans=0;??
  • ????????for(int?f=1;f<=k;f++)??
  • ????????{??
  • ????????????my.clear();??
  • ????????????for(int?i=1;i<=m;i++)??
  • ????????????{??
  • ????????????????????my.addedge(0,i,suply[i][f],0);??
  • ????????????????????for(int?g=1;g<=n;g++)??
  • ????????????????????{??
  • ????????????????????????my.addedge(i,m+g,suply[i][f],trans[f][g][i]);??
  • ????????????????????}??
  • ????????????}??
  • ????????????for(int?i=1;i<=n;i++)??
  • ????????????{??
  • ????????????????my.addedge(m+i,m+n+1,need[i][f],0);??
  • ????????????}??
  • ????????????ans+=my.solve(0,m+n+1);??
  • ????????}??
  • ????????printf("%d\n",ans);??
  • ????}??
  • ????return?0;??
  • } ?
  • 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的poj 2516 最小费用最大流的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。