poj3189:http://poj.org/problem?id=3189

题意:这一题的题意。我看了很长时间才弄懂。就是给你n头牛,m个牛棚,每个牛对每一个牛棚会有一个满值,第i行第j个数表示的是第i头牛满意度为j的是牛棚mp[i][j],而且牛棚会有一定的容量。然后把牛分配到相应的牛棚,使得最大的满意度和最小的满意度之间的差值最小。

题解:由于,满意度的范围很小,所以就自然想到用枚举区间的办法,枚举满意度,但是如果没有优化的话,是会T的,我加了一个二分以及其他的优化,跑了300多点,

  1 #include<iostream>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cstdio>
  5 #include<queue>
  6 #define INF 100000000
  7 using namespace std;
  8 const int N=1105;
  9 const int M=1000000;
 10 struct Node{
 11    int v;
 12    int f;
 13    int next;
 14 }edge[M];
 15 int n,m,u,v,cnt,sx,ex;
 16 int head[N],pre[N];
 17 int val[N][40],val1[N];//根据题目要求申请
 18 void init(){
 19     cnt=0;
 20     memset(head,-1,sizeof(head));
 21 }
 22 void add(int u,int v,int w){
 23     edge[cnt].v=v;
 24     edge[cnt].f=w;
 25     edge[cnt].next=head[u];
 26     head[u]=cnt++;
 27     edge[cnt].f=0;
 28     edge[cnt].v=u;
 29     edge[cnt].next=head[v];
 30     head[v]=cnt++;
 31 }
 32 bool BFS(){
 33   memset(pre,0,sizeof(pre));
 34   pre[sx]=1;
 35   queue<int>Q;
 36   Q.push(sx);
 37  while(!Q.empty()){
 38      int d=Q.front();
 39      Q.pop();
 40      for(int i=head[d];i!=-1;i=edge[i].next    ){
 41         if(edge[i].f&&!pre[edge[i].v]){
 42             pre[edge[i].v]=pre[d]+1;
 43             Q.push(edge[i].v);
 44         }
 45      }
 46   }
 47  return pre[ex]>0;
 48 }
 49 int dinic(int flow,int ps){
 50     int f=flow;
 51      if(ps==ex)return f;
 52      for(int i=head[ps];i!=-1;i=edge[i].next){
 53         if(edge[i].f&&pre[edge[i].v]==pre[ps]+1){
 54             int a=edge[i].f;
 55             int t=dinic(min(a,flow),edge[i].v);
 56               edge[i].f-=t;
 57               edge[i^1].f+=t;
 58              flow-=t;
 59              if(flow<=0)break;
 60         }
 61
 62      }
 63       if(f-flow<=0)pre[ps]=-1;
 64       return f-flow;
 65 }
 66 int solve(){
 67     int sum=0;
 68     while(BFS())
 69         sum+=dinic(INF,sx);
 70     return sum;
 71 }
 72 int main(){
 73     int ans,temp;
 74     while(~scanf("%d%d",&n,&m)) {
 75          init();
 76          ans=INF;sx=0,ex=n+m+1;
 77        for(int i=1;i<=n;i++)
 78         for(int j=1;j<=m;j++){
 79             scanf("%d",&temp);
 80             val[i][temp]=j;
 81         }
 82         for(int i=1;i<=m;i++)
 83           scanf("%d",&val1[i]);
 84     for(int i=1;i<=m;i++){
 85         int l=i,r=m;
 86         while(l<=r){
 87             int mid=(l+r)/2;
 88             if(mid-i>=ans){
 89                 r=mid-1;
 90                 continue;
 91             }
 92              init();
 93             for(int k=1;k<=n;k++)
 94                 add(0,k,1);
 95             for(int k=1;k<=n;k++)
 96             for(int h=1;h<=m;h++)
 97             if(val[k][h]<=mid&&val[k][h]>=i)
 98               add(k,n+h,1);
 99             for(int k=1;k<=m;k++)
100                 add(k+n,n+m+1,val1[k]);
101             if(solve()==n){
102                ans=min(ans,mid-i);
103                 r=mid-1;
104             }
105             else
106                 l=mid+1;
107          }
108       }
109       printf("%d\n",ans+1);
110     }
111       return 0;
112 }

View Code

转载于:https://www.cnblogs.com/chujian123/p/3941420.html

Steady Cow Assignment相关推荐

  1. poj 3189 Steady Cow Assignment(二分+最大流)

    题意:N头牛(1000),B个农场(20),每个农场可以容纳一定数量的牛. 每头牛对每个农场都有一个排名(排名从1~B).每头牛都会在B个农场中的某一个,这头牛的高兴程度是它对这个农场的排名.为了使每 ...

  2. POJ - 3189 Steady Cow Assignment(二分图多重匹配)

    题目链接:点击查看 题目大意:给出n只奶牛以及m个牛棚,接下来给出一个n*m的矩阵,给出每一只奶牛对于每个牛棚的喜爱度,按照降序给出,从rank1到rankm,现在问如何分配牛棚能让所有奶牛中最高的r ...

  3. POJ 3189 Steady Cow Assignment

    POJ_3189 一开始题意各种理解错,首先输入的那个矩阵第i行第j列的值表示的是奶牛i会第j个中意的牛棚,最后求的range就相当于j的range,至于range是变化的范围,比如j在1.2变化,那 ...

  4. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  5. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  6. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  7. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  8. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  9. 杭电oj题目题型分类(转)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

最新文章

  1. Web开发中的相对路径和绝对路径
  2. springmvc+mybatis,在mybatis逆向工程的基础上使用模板自动生成controller层代码
  3. java 执行html里的js_如何用java执行指定页面中的js代码
  4. 动态规划 53:Maximum Subarray,152:Maximum Subarray,266. Palindrome Permutation 回文全排列...
  5. spark之1:快速入门
  6. 用一张白纸推导出 RAFT 算法
  7. linux集成开发环境
  8. java游戏应龙女魃转世_应龙和女魃的凄美爱情,究竟是爱情,还是阴谋?
  9. 博图能打开s7200吗_域名掉备案了,还能打开吗?域名掉备案了怎么办?
  10. Magento 添加 google font Adding a google fonts into Magento
  11. 一篇文章带你快速入门JavaScript(自学者福利)
  12. 医疗用户端app原型/问诊/挂号/开药/视频问诊/电子处方/预约/互联网医疗平台用户端/Axure原型/电话问诊/药品/就诊开药/远程医疗平台/线上问诊/线上看病/rp源文件/移动端医疗原型/门诊
  13. ​iPhone 13发布时间曝光;中国博士创造新算法,提高步态精确识别身份的精度;iOS 15引入半身照的人物识别功能|极客头条...
  14. C语言中的strcmp函数的作用是什么,c语言strcmp函数用法是什么?
  15. 阿帕奇apache服务器和webDav服务器快速配置。
  16. 七月算法-P2 概率论与数理统计(1)
  17. Win10(11)下Qt6.2编译Qtxlsx库
  18. 微信朋友验证消息是什么来源_微信好友来源朋友验证消息
  19. Kettle安装完报错:Driver class org.gjt.mm.mysql.Driver could not be found
  20. OR-Tools:2-包装问题,箱包问题(bin packing)

热门文章

  1. yii2: 点击编辑后,左侧的连接(a.navtab)失效,变成在新窗口打开
  2. 【云图】如何创建云图(云存储)
  3. 10g索引的作用实验1
  4. 无线安全 - 802.1x 和 EAP 类型
  5. ISA2004升级到ISA2006需要注意的事项
  6. New template: condition
  7. MS SQL入门基础:更改数据库
  8. laravel接口开发JWTAuth
  9. python最长匹配_二分图最大匹配:匈牙利算法的python实现
  10. python执行shell脚本、执行mongodb_mongodb执行js脚本(一)---shell执行