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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 2112 Optimal Milking(二分图匹配)

發布時間:2025/6/17 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 2112 Optimal Milking(二分图匹配) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

【題目鏈接】?http://poj.org/problem?id=2112

?

【題目大意】

  給出一些擠奶器,每臺只能供給M頭牛用,牛和擠奶器之間有一定的距離
  現在要讓每頭牛都擠奶,同時最小化牛到擠奶器的距離,求最小距離

?

【題解】

  首先用floyd計算出牛和擠奶器之間的距離,
  我們二分最小答案,然后利用二分圖檢驗是否可行,對于M匹配這個條件可以將擠奶器拆點。

?

【代碼】

#include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; const int MAX_V=1000; const int INF=0x3f3f3f3f; int V,match[MAX_V]; vector<int> G[MAX_V]; bool used[MAX_V]; void add_edge(int u,int v){G[u].push_back(v);G[v].push_back(u); } bool dfs(int v){used[v]=1;for(int i=0;i<G[v].size();i++){int u=G[v][i],w=match[u];if(w<0||!used[w]&&dfs(w)){match[v]=u;match[u]=v;return 1;}}return 0; } int bipartite_matching(){int res=0;memset(match,-1,sizeof(match));for(int v=0;v<V;v++){if(match[v]<0){memset(used,0,sizeof(used));if(dfs(v))res++;}}return res; } const int MAX_N=240; int K,C,M; int mp[MAX_N][MAX_N]; void construct_graph(int lim){V=C+K*M;for(int i=0;i<=V;i++)G[i].clear();for(int i=1;i<=C;i++){for(int j=1;j<=K;j++){if(mp[K+i][j]<=lim){for(int t=1;t<=M;t++){add_edge(i,C+(j-1)*M+t);}}}} } int init(){for(int i=1;i<=K+C;i++)for(int j=1;j<=K+C;j++){scanf("%d",&mp[i][j]);if(mp[i][j]==0)mp[i][j]=INF;}for(int k=1;k<=K+C;k++)for(int i=1;i<=K+C;i++)for(int j=1;j<=K+C;j++)mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); } void solve(){int ans=1,l=1,r=200*(K+C);while(l<=r){int mid=(l+r)>>1;construct_graph(mid);if(bipartite_matching()==C)ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans); } int main(){while(~scanf("%d%d%d",&K,&C,&M)){init();solve();}return 0; }

轉載于:https://www.cnblogs.com/forever97/p/poj2112.html

總結

以上是生活随笔為你收集整理的POJ 2112 Optimal Milking(二分图匹配)的全部內容,希望文章能夠幫你解決所遇到的問題。

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