Poj(3686),最小权匹配,多重匹配,KM
The Windy's##
| Time Limit: 5000MS | Memory Limit: 65536K |
| Total Submissions: 4939 | Accepted: 2080 |
Description
The Windy's is a world famous toy factory that owns M top-class workshop to make toys. This year the manager receives N orders for toys. The manager knows that every order will take different amount of hours in different workshops. More precisely, the i-th order will take Zij hours if the toys are making in the j-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 matrix Zij (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###
POJ Founder Monthly Contest – 2008.08.31, windy7926778
题意:###
有N个工件要在M个机器上加工,有一个N*M的矩阵描述其加工时间。同一时间内每个机器只能加工一个工件,问加工完所有工件后,使得平均加工时间最小。
分析:###
1, 首先,这是一个最小权匹配,但是我没写过,然后看了一下网上的结题报告,又问了一下阳哥,发现,最小权匹配可以转换为最大权匹配,权值改为负数就可以了。
2, 然后是拆点,分块,每一个机器都对应了nx个玩具。
3, 这里是最难的地方了。我也是看了结题报告才知道怎么处理这里,就是说可能一个机器加工多个玩具,比如说k个,耗时为a1,(a1+a2),(a1+a2+a3),......(a1+a2+......+ak);
那么,对于一个玩具(例如a1),他所贡献的时间其实为a1乘k,我们可以发现规律,对于倒数第k的玩具,他贡献的耗时为k*a1,那么拆点的时候,就应该是a1,a1乘2,......
当做模板好好学习吧!!!
Code(C++):##
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAXN 55
#define inf 0x7ffffff
int w[MAXN][2555];
int lx[MAXN],ly[2555];
int linky[2555];
int visx[MAXN],visy[2555];
int slack[2555];
int nx,ny;
int n,m;
bool find(int x)
{
visx[x]=1;
for(int y=1;y<=ny;y++)
{
if(visy[y]) continue;
int t=lx[x]+ly[y]-w[x][y];
if(t==0)
{
visy[y]=1;
if(linky[y] ==-1 || find(linky[y]))
{
linky[y]=x;
return true;
}
}
else if(slack[y] > t)
slack[y]=t;
}
return false;
}
int KM()
{
memset(linky,-1,sizeof(linky));
memset(ly,0,sizeof(ly));
for(int i=1;i<=nx;i++)
{
lx[i]=-inf;
for(int j=1;j<=ny;j++)
if(w[i][j] >lx[i])
lx[i]=w[i][j];
}
for(int x=1;x<=nx;x++)
{
for(int i=1;i<=ny;i++)
slack[i]=inf;
while(1)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
if(find(x)) break;
int d=inf;
for(int i=1;i<=ny;i++)
if(!visy[i] && d>slack[i])
d=slack[i];
for(int i=1;i<=nx;i++)
if(visx[i])
lx[i]-=d;
for(int i=1;i<=ny;i++)
if(visy[i])
ly[i]+=d;
else
slack[i]-=d;
}
}
int ans=0;
for(int i=1;i<=ny;i++)
if(linky[i] >-1)
ans+=w[linky[i]][i];
return -ans;
}
void init()
{
scanf("%d%d",&n,&m);
nx=n;
ny=n*m;
int cost;
for(int i=1;i<=n;i++)
{
int cnt=1;
for(int j=1;j<=m;j++)
{
scanf("%d",&cost);
for(int k=1;k<=n;k++)
{
w[i][cnt++]=-cost*k;
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
double ans=1.0*KM()/n;
printf("%.6f\n",ans);
}
return 0;
}
Poj(3686),最小权匹配,多重匹配,KM的更多相关文章
- POJ 2400 最小权匹配
吐槽:首先,这道题的输入居然是错的.要将上下两个矩阵的位置换一下才可以出样例,也就是上面那个矩阵是employee对Supervisor的打分,下面那个矩阵才是Supervisor对employee的 ...
- Poj 3189 Steady Cow Assignment (多重匹配)
题目链接: Poj 3189 Steady Cow Assignment 题目描述: 有n头奶牛,m个棚,每个奶牛对每个棚都有一个喜爱程度.当然啦,棚子也是有脾气的,并不是奶牛想住进来就住进来,超出棚 ...
- POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】
Optimal Milking Time Limit:2000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Sub ...
- [ACM] POJ 3686 The Windy's (二分图最小权匹配,KM算法,特殊建图)
The Windy's Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4158 Accepted: 1777 Descr ...
- poj 3686(拆点+最小权匹配)
题目链接:http://poj.org/problem?id=3686 思路:显然工件为X集,机器为Y集合.由于每个机器一次只能加工一个部件,因此我们可以将一台机器拆成N个点,至于部件与机器之间连多大 ...
- poj 2195(KM求最小权匹配)
题目链接:http://poj.org/problem?id=2195 思路:我们都知道KM使用来求最大权匹配的,但如果要求最小权匹配,只需把图中的权值改为负值,求一次KM,然后权值和取反即可. ht ...
- 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)
[POJ 2400] Supervisor, Supervisee(KM求最小权匹配) Supervisor, Supervisee Time Limit: 1000MS Memory Limit ...
- 【POJ 2195】 Going Home(KM算法求最小权匹配)
[POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- poj3565 Ants km算法求最小权完美匹配,浮点权值
/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...
随机推荐
- pg_rewind 介绍
pg_rewind—使一个PostgreSQL数据目录与另一个数据目录(该目录从第一个PostgreSQL数据目录创建而来)一致. 描述 pg_rewind是一个在集群的时间线参数偏离之后,用于使一个 ...
- poj 题目分类(3)
OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一 ...
- Java基础(62):Eclipse调试(Debug)的10条技巧(转)
在看这篇文章前,我推荐你看一下Eclipse 快捷键手册 先提三点 不要使用System.out.println作为调试工具 启用所有组件的详细的日志记录级别 使用一个日志分析器来阅读日志 1.条件断 ...
- Java基础(55):Exception类详解(转)
Java中的异常 Exception java.lang.Exception类是Java中所有异常的直接或间接父类.即Exception类是所有异常的根类. 比如程序: public class Ex ...
- UVALive 6145 Version Controlled IDE(可持久化treap、rope)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- paper 9:SVM番外篇:支持向量机系列六:Duality —— 关于 dual 问题推导的一些补充理论。
在之前关于 support vector 的推导中,我们提到了 dual ,这里再来补充一点相关的知识.这套理论不仅适用于 SVM 的优化问题,而是对于所有带约束的优化问题都适用的,是优化理论中的一个 ...
- MVC权限管理系统dwpro项目权限按钮无故自动消失问题
关于那个权限按钮丢失的问题修改方法如下: 把源文件中的XmlConfig文件夹里的Config.xml文件剪切到根目录下,并修改文件名为:app.config(关键是后缀不是xml了是config) ...
- java 如何接收数据集参数
@RequestBody String requestBody 可以接收 josn 字符串 ,list 等等 public int updateLoaneePriorityNew(HttpServ ...
- sql 存储过程 分页
ALTER PROCEDURE [dbo].[BrokerToLenderDataShow2]@Where VARCHAR(200), --查询条件 不含'where'字符,如id>10 and ...
- 【SPFA】 最短路计数
最短路计数 [问题描述] 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式] 输入第一行包含2个正整数N,M,为图的顶点数与边数. ...