POJ 2112 Optimal Milking(二分图匹配)
生活随笔
收集整理的這篇文章主要介紹了
POJ 2112 Optimal Milking(二分图匹配)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
【題目鏈接】?http://poj.org/problem?id=2112
?
【題目大意】
給出一些擠奶器,每臺只能供給M頭牛用,牛和擠奶器之間有一定的距離
現(xiàn)在要讓每頭牛都擠奶,同時最小化牛到擠奶器的距離,求最小距離
?
【題解】
首先用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; }轉(zhuǎn)載于:https://www.cnblogs.com/forever97/p/poj2112.html
總結(jié)
以上是生活随笔為你收集整理的POJ 2112 Optimal Milking(二分图匹配)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 区分wifi是5G还是2
- 下一篇: Nginx笔记总结八:ngx_http_