poj 2112 Optimal Milking

综合题:floyed+二分答案+网络流判断。

题意:1、K台机器,C头奶牛,M是每台机器处理奶牛的上限。

        2、每头奶牛只能走到一台机器。

        3、已知(K+C)的矩阵描述了彼此的距离(0表示INF),求在满足M的条件下,每头奶牛所走的最长距离的min。

分析:1、首先,容易想到求出彼此之间的最短路。

        2、真正要研究的是矩阵右上角的 K行*C列个点。由M可知,每行最多有M个数字。

        3、容易想到以个数建边。即源点s与奶牛连边,容量为1;机器与汇点t连边,容量为M。

    4、利用二分,不断逼近所求的最长距离的min,将所有奶牛到机器的路径与min比较,建图并判断最大流是否为C(每头牛都能走到)

View Code
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<iostream>
  6 using namespace std;
  7 #define N 250
  8 #define M 6010
  9 #define INF 0x7ffffff
 10 
 11 struct E{
 12     int v,c,next;
 13  }e[N*N<<2];
 14 
 15 int tol,head[N];
 16 int p,k,c,m;
 17 int st,ed;
 18 int mid;
 19 int map[N][N];
 20 
 21 void Floyd();
 22 void Init();
 23 void Add(int s,int t,int c);
 24 int Sap(int s,int t,int n);
 25 
 26 int gap[N];
 27 int dis[N];
 28 int pre[N];
 29 int cur[N];
 30 
 31 int main()
 32 {
 33     int i,j;
 34     while(scanf("%d%d%d",&k,&c,&m)!=EOF)
 35     {
 36         p=k+c;
 37         for(i=0;i<p;i++)
 38         {
 39             for(j=0;j<p;j++)
 40             {
 41                 scanf("%d",&map[i][j]);
 42                 if(i!=j&&!map[i][j])
 43                     map[i][j]=INF;
 44             }
 45         }
 46     
 47         Floyd();
 48     
 49         int l=0,r=40000;
 50         st=p;
 51         ed=st+1;
 52         int res;                        //!!  二分写挫了
 53         while(l<=r)
 54         {
 55             mid=(l+r)/2;
 56             Init();
 57             if(Sap(st,ed,p+2)){
 58                 r=mid-1;
 59                 res=mid;
 60             }else l=mid+1;
 61         }
 62         printf("%d\n",res);
 63     }
 64     return 0;
 65 }
 66 
 67 void Floyd()
 68 {
 69     int i,j,pos;
 70     for(pos=0;pos<p;pos++)
 71     {
 72         for(i=0;i<p;i++)
 73         {
 74             if(map[i][pos]==INF)continue;
 75             for(j=0;j<p;j++)
 76             {
 77                 if(map[i][pos]+map[pos][j]<map[i][j])
 78                     map[i][j]=map[i][pos]+map[pos][j];
 79             }
 80         }
 81     }
 82 }
 83 
 84 void Init()
 85 {
 86     int i,j;
 87     tol=0;
 88     memset(head,-1,sizeof(head));
 89     for(i=0;i<k;i++)
 90     {
 91         for(j=k;j<p;j++)
 92         {
 93             if(!i){
 94                 Add(st,j,1);
 95             }
 96             if(mid>=map[i][j]){
 97                 Add(j,i,INF);          //!!  i,j写反了
 98             }
 99         }
100         Add(i,ed,m);
101     }
102 }
103 
104 void Add(int s,int t,int c)
105 {
106     e[tol].v=t;
107     e[tol].c=c;
108     e[tol].next=head[s];
109     head[s]=tol++;
110 
111     e[tol].v=s;
112     e[tol].c=0;
113     e[tol].next=head[t];
114     head[t]=tol++;
115 }
116 
117 int Sap(int s,int t,int n)
118 {
119     int i;
120     for(i=0;i<=n;i++)
121     {
122         dis[i]=gap[i]=0;
123         cur[i]=head[i];
124     }
125     gap[0]=n;
126     int u=pre[s]=s,maxf=0,aug=INF,v;
127     while(dis[s]<n)
128     {
129 loop:   for(i=cur[u];i!=-1;i=e[i].next)
130         {
131             v=e[i].v;
132             if(e[i].c>0&&dis[u]==dis[v]+1){
133                 aug=min(aug,e[i].c);
134                 pre[v]=u;
135                 cur[u]=i;
136                 u=v;
137                 if(u==t){
138                     while(u!=s)
139                     {
140                         u=pre[u];
141                         e[cur[u]].c-=aug;
142                         e[cur[u]^1].c+=aug;
143                     }
144                     maxf+=aug;
145                     aug=INF;
146                 }
147                 goto loop;
148             }
149         }
150         int min=n;
151         for(i=head[u];i!=-1;i=e[i].next)
152         {
153             v=e[i].v;
154             if(e[i].c>0&&dis[v]<min){
155                 min=dis[v];
156                 cur[u]=i;
157             }
158         }
159         if(!(--gap[dis[u]]))
160             break;
161         ++gap[dis[u]=min+1];
162         u=pre[u];
163     }
164     return maxf==c;                //!!
165 }

 

 

转载于:https://www.cnblogs.com/zstu-abc/archive/2013/04/30/3052490.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值