The Windy's
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 4158   Accepted: 1777

Description

The Windy's is a world famous toy factory that owns M top-class workshop to make toys. This year the manager receivesN orders for toys. The manager knows that every order will take different amount of hours in different workshops. More
precisely, thei-th order will take Zij hours if the toys are making in thej-th workshop. Moreover, each order's work must be wholly completed in the same workshop. And a workshop can
not switch to another order until it has finished the previous one. The switch does not cost any time.

The manager wants to minimize the average of the finishing time of the N orders. Can you help him?

Input

The first line of input is the number of test case. The first line of each test case contains two integers,N and
M (1 ≤ N,M ≤ 50).

The next N lines each contain M integers, describing the matrixZij (1 ≤
Zij ≤ 100,000) There is a blank line before each test case.

Output

For each test case output the answer on a single line. The result should be rounded to six decimal places.

Sample Input

3

3 4
100 100 100 1
99 99 99 1
98 98 98 1 3 4
1 100 100 100
99 1 99 99
98 98 1 98 3 4
1 100 100 100
1 99 99 99
98 1 98 98

Sample Output

2.000000
1.000000
1.333333

Source

解题思路:

题意为有n个订单,m个工厂,第i个订单在第j个工厂生产的时间为t[i][j],一个工厂能够生产多个订单,但一次仅仅能生产一个订单,也就是说假设先生产a订单,那么b订单要等到a生产完以后再生产,问n个订单用这m个工厂所有生产完须要最少的时间是多少。

思路转载于:http://blog.csdn.net/lin375691011/article/details/19292473

这个题在建图上有一些须要思考非常长时间的地方。由于每一个订单所消耗的时间是车间完毕订单的时间加上订单等待的时间。我们设在车间A须要完毕k个订单,消耗的总时间是t1+(t1+t2)+(t1+t2+t3)……转换一下就是t1*k+t2*(k-1)+t3*(k-3)……我们就找到了规律:当第i个订单在第j个车间是倒数第k个任务时,总消耗时间须要加上订单i在车间相应消耗时间的k倍。

补充:也就是说把m个工厂看作m个点,每一个点又拆成n个点(由于每一个工厂最多能够生产n个订单),拆成的第i个点代表某一个订单在该工厂里面是倒数第i个被生产的。

g[i][k*n+j]=-t[i][k]*(j+1);//第i个订单在第k个工厂生产,且在第k个工厂中生产的全部订单中它排在倒数第j位被生产

0<=i<n ,   0<=k<m ,  0<=j<n

如图:

KM算法是求找出n条边所获得的最大权值,而在本题中要求最小权值,把所用时间取反,那么利用Km算法所求的最大权值的相反数就是我们所要求的最小权值。

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <iomanip>
using namespace std;
const int maxn=52;
const int inf=0x3f3f3f3f;
int n,m;
int t[maxn][maxn];
int nx,ny;
int g[maxn][maxn*maxn];
int linked[maxn*maxn],lx[maxn],ly[maxn*maxn];
int slack[maxn*maxn];
bool visx[maxn],visy[maxn*maxn]; bool DFS(int x)
{
visx[x]=true;
for(int y=0;y<ny;y++)
{
if(visy[y])
continue;
int tmp=lx[x]+ly[y]-g[x][y];
if(tmp==0)
{
visy[y]=true;
if(linked[y]==-1||DFS(linked[y]))
{
linked[y]=x;
return true;
}
}
else if(slack[y]>tmp)
slack[y]=tmp;
}
return false;
} int KM()
{
memset(linked,-1,sizeof(linked));
memset(ly,0,sizeof(ly));
for(int i=0;i<nx;i++)
{
lx[i]=-inf;
for(int j=0;j<ny;j++)
if(g[i][j]>lx[i])
lx[i]=g[i][j];
}
for(int x=0;x<nx;x++)
{
for(int i=0;i<ny;i++)
slack[i]=inf;
while(true)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
if(DFS(x))
break;
int d=inf;
for(int i=0;i<ny;i++)
if(!visy[i]&&d>slack[i])
d=slack[i];
for(int i=0;i<nx;i++)
if(visx[i])
lx[i]-=d;
for(int i=0;i<ny;i++)
{
if(visy[i])
ly[i]+=d;
else
slack[i]-=d;
}
}
}
int ans=0;
for(int i=0;i<ny;i++)
if(linked[i]!=-1)
ans+=g[linked[i]][i];
return -ans;
} int main()
{
int cas;
cin>>cas;
while(cas--)
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>t[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<m;k++)
g[i][k*n+j]=-t[i][k]*(j+1);//第i个订单在第k个工厂生产,且在第k个工厂中生产的全部订单中它排在倒数第j位被生产
m=n*m;
nx=n;ny=m;
cout<<setiosflags(ios::fixed)<<setprecision(6)<<1.0*KM()/n<<endl;
}
return 0;
}

[ACM] POJ 3686 The Windy&#39;s (二分图最小权匹配,KM算法,特殊建图)的更多相关文章

  1. 二分图最大权匹配——KM算法

    前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...

  2. HDU2255 奔小康赚大钱 —— 二分图最大权匹配 KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    ...

  3. HDU 1533:Going Home(KM算法求二分图最小权匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 Going Home Problem Description   On a grid map there ...

  4. 二分图 最大权匹配 km算法

    这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...

  5. Hdu2255 奔小康赚大钱(二分图最大权匹配KM算法)

    奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好 ...

  6. HDU3488 Tour —— 二分图最大权匹配 KM算法

    题目链接:https://vjudge.net/problem/HDU-3488 Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit ...

  7. POJ 3686 The Windy's (最小费用流或最佳完全匹配)

    题意:有n个订单m个车间,每个车间均可以单独完成任何一个订单.每个车间完成不同订单的时间是不同的.不会出现两个车间完成同一个订单的情况.给出每个订单在某个车间完成所用的时间.问订单完成的平均时间是多少 ...

  8. [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  9. 网络流——二分图最优匹配KM算法

    前言 其实这个东西只是为了把网络流的内容凑齐而写的(反正我是没有看到过这样子的题不知道田忌赛马算不算) 算法过程 我们令左边的点(其实二分图没有什么左右)为女生,右边的点为男生,那么: 为每一个女生定 ...

随机推荐

  1. NYOJ 12 喷水装置(二)

    pid=12">喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n( ...

  2. SE 2014年4月14日

    一. 概述BGP的特点 BGP协议是一种距离矢量协议,基于TCP的179端口,BGP协议不会动态的学习路由,只能将IGP协议学习到的或者静态路由注入到BGP中,成为BGP路由,BGP路由携带有丰富的路 ...

  3. 聊聊高并发(三十八)解析java.util.concurrent各个组件(十四) 理解Executor接口的设计

    JUC包中除了一系列的同步类之外,就是Executor运行框架相关的类.对于一个运行框架来说,能够分为两部分 1. 任务的提交 2. 任务的运行. 这是一个生产者消费者模式,提交任务的操作是生产者,运 ...

  4. Cocos2d-x3.0 Button

    Size widgetSize = Director::getInstance()->getWinSize(); Text* alert = Text::create("Layout& ...

  5. Android网络编程http派/申请服务

    最近的研究Android网络编程知识,这里有一些想法,今晚学习.与您分享. 在实际的应用程序的开发非常需要时间appserver请求数据,那么app怎样发送请求呢?以下的代码就是当中的一种情况.使用H ...

  6. Knockout应用开发指南 第三章:绑定语法(1)

    原文:Knockout应用开发指南 第三章:绑定语法(1) 第三章所有代码都需要启用KO的ko.applyBindings(viewModel);功能,才能使代码生效,为了节约篇幅,所有例子均省略了此 ...

  7. el表达式 分页提交 中文乱码

    el表达式 分页提交 中文乱码 网上找了很多资料,没能解决我的问题.并不是说网上的那些资料不好.而是不适用于我的问题吧. 看看的的问题: 原始页面 单击下一页 , 乱码. 引起的原因则是因为自己的js ...

  8. Java&Android反编工具打包

    Java&Android反编工具: 1.Eclipse反编插件:安装到Eclipse后,可以简要的查看jar包中的*.class; 2.DoAPK:反编*.apk为smali和一些资源文件,可 ...

  9. hdu1011(树形背包)

    hdu1011 http://acm.hdu.edu.cn/showproblem.php?pid=1011 给定n个洞穴和m个士兵(每个士兵能消灭20个bugs) 然后给定每个洞穴的bugs数量(背 ...

  10. 《深入Java虚拟机》笔记:指令集 (转)

    <深入Java虚拟机>笔记:指令集   指令 含义 iconst_m1 把int型常量-1压入栈中 iconst_0 把int型常量压入栈中 fconst_1 把float型常量1压入栈中 ...