[ACM] POJ 3686 The Windy's (二分图最小权匹配,KM算法,特殊建图)
| 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's (二分图最小权匹配,KM算法,特殊建图)的更多相关文章
- 二分图最大权匹配——KM算法
前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...
- HDU2255 奔小康赚大钱 —— 二分图最大权匹配 KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) ...
- HDU 1533:Going Home(KM算法求二分图最小权匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=1533 Going Home Problem Description On a grid map there ...
- 二分图 最大权匹配 km算法
这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...
- Hdu2255 奔小康赚大钱(二分图最大权匹配KM算法)
奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好 ...
- HDU3488 Tour —— 二分图最大权匹配 KM算法
题目链接:https://vjudge.net/problem/HDU-3488 Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit ...
- POJ 3686 The Windy's (最小费用流或最佳完全匹配)
题意:有n个订单m个车间,每个车间均可以单独完成任何一个订单.每个车间完成不同订单的时间是不同的.不会出现两个车间完成同一个订单的情况.给出每个订单在某个车间完成所用的时间.问订单完成的平均时间是多少 ...
- [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 网络流——二分图最优匹配KM算法
前言 其实这个东西只是为了把网络流的内容凑齐而写的(反正我是没有看到过这样子的题不知道田忌赛马算不算) 算法过程 我们令左边的点(其实二分图没有什么左右)为女生,右边的点为男生,那么: 为每一个女生定 ...
随机推荐
- 新浪SAE数据库信息
此账号仅能在SAE平台上使用,不能从外部连接我们建议开发者使用SaeMysql操作数据库 如果您想自己实现数据库相关操作,可以使用以下常量: 用户名 : SAE_MYSQL_USER 密 码 : S ...
- 在Button上、下、左、右位置加入图片和文字
转载请注明出处:http://blog.csdn.net/droyon/article/details/37564419 非常多人有如标题所述的需求,并且大多数人採用了自己定义组件攻克了需求,事实上还 ...
- 《Javascript高级程序设计》读书笔记之闭包
闭包 function createComparisonFunction(propertyName) { return function (object1, object2) { var value1 ...
- oracle spfile和pfile文件(转)
--======================== -->Oracle 参数文件 --======================== /* 参数文件(10g中的参数文件) 主要用来记录数据库 ...
- firefox os 2.1版本号UI接口方面有了质的飞跃
由Mozilla新的移动设备操作系统开发Firefox os 经过多次迭代,我们看到的版本号Mozilla进步和艰辛,在充满当然,任何Android设备的情况下,坚持一个新的操作系统的移动设备,后1. ...
- SharePoint Server 2010 删除Web应用
SharePoint Server 2010 删除Web应用 因为之前的测试.在SharePointserver创建于非常多Web应用(我是在本机Win7系统上安装的SharePoin ...
- Linux下 目录 压缩 解压缩 打包
http://blog.sina.com.cn/s/blog_7479f7990100zwkp.html tar -zcvf /home/xahot.tar.gz /xahot tar -zcv ...
- SIP基本呼叫
我们首先来看下主要的呼叫流程. INVITEsip:69690067@beijing.chinamobile.com;user=phone SIP/2.0 From:"+8610696900 ...
- UML之轻松入门(3)-SRP做好厨子,让别人编程去吧
一个厨子能够做出一手好菜,或许他是新东方毕业的或者是祖传秘方.你让他做上一桌佳肴那是简单.快乐而又高效的,然而让他编程就会成为一种苦恼并且让人想不通的一件事.或许这个比喻不是非常恰当,可是对 ...
- UVa 12459 - Bees' ancestors
称号:区区女性有父亲和母亲,区区无人机只有一个母亲,我问一个单纯的无人机第一n随着祖先的数量. 分析:递归.Fib序列. 状态定义:建立f(k)和m(k)分别用于第一k雌蜂和雄蜂的数量: 递推关系:f ...