链接:http://poj.org/problem?id=2112
题意是有K个机器,C头奶牛,每个机器能给M个奶牛挤奶,求奶牛的要走的最大行走距离的最小值。
输入的邻接矩阵是直接相连的距离,要求每个点之间的最短距离要floyd一下。
建图的时候这样考虑,建立一个源点,源点到每头牛的流量是1,二分牛到机器的距离,小于等于这个距离的路径流量++,建立一个汇点,每个机器到汇点的流量=M。
二分牛到机器的距离的时候要注意上界,因为有些路径可能原来不相连,floyd之后相连了,所以上界是200*(K+C),因为一个点可能经过所有(K+C)个点之后才相连,建图完套dinic模板就解决了
代码:
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<map> #include<iostream> #include<vector> #include<cstdlib> #include<cmath> #include<stack> #include<ctime> #include<cctype> #include<algorithm> using namespace std; const int INF=1e9+7; typedef pair<int,int> pii; typedef long long ll; int K,C,M,n,pic[250][250],a[250][250],d[250]; void floyd(){ for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(pic[i][k]+pic[k][j]<pic[i][j]){ pic[i][j]=pic[i][k]+pic[k][j]; } } } } } bool BFS(){ queue<int> Q; memset(d,-1,sizeof(d)); d[n+1]=0;Q.push(n+1); while(!Q.empty()){ int s=Q.front();Q.pop(); for(int i=0;i<=n+1;i++){ if(a[s][i]>0&&d[i]<0){ d[i]=d[s]+1;Q.push(i); } } } return d[0]>0; } int DFS(int s,int t,int flow){ if(s==t||!flow)return flow; int ans=0; for(int i=0;i<=n+1;i++){ if(d[i]==d[s]+1&&a[s][i]>0){ int ff=DFS(i,t,min(flow,a[s][i])); if(ff){ a[s][i]-=ff; a[i][s]+=ff; ans+=ff; flow-=ff; if(!flow)break; } } } if(ans==0)d[s]=-1; return ans; } int dinic(){ int ans=0; while(BFS()){ ans+=DFS(n+1,0,INF); } return ans; } void build(int len){ memset(a,0,sizeof a); int st=n+1,ed=0; for(int i=1;i<=K;i++){ a[i][ed]=M; } for(int i=K+1;i<=n;i++){ a[st][i]++; } for(int i=1;i<=K;i++){ for(int j=K+1;j<=n;j++){ if(pic[j][i]<=len){ a[j][i]++; } } } } int main(){ // freopen("D://input.txt","r",stdin); while(scanf("%d%d%d",&K,&C,&M)!=EOF){ n=K+C; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&pic[i][j]); if(!pic[i][j])pic[i][j]=INF; } } floyd(); int low=0,high=n*200,mid,ans=-1; while(low<=high){ //printf("%d %d ",low,high); mid=(low+high)>>1; build(mid); if(dinic()==C){ ans=mid; high=mid-1; } else low=mid+1; } printf("%d\n",ans); } // printf("%.3f\n",(double)clock()/CLOCKS_PER_SEC); return 0; }