题目链接

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的更多相关文章

  1. POJ 2400 最小权匹配

    吐槽:首先,这道题的输入居然是错的.要将上下两个矩阵的位置换一下才可以出样例,也就是上面那个矩阵是employee对Supervisor的打分,下面那个矩阵才是Supervisor对employee的 ...

  2. Poj 3189 Steady Cow Assignment (多重匹配)

    题目链接: Poj 3189 Steady Cow Assignment 题目描述: 有n头奶牛,m个棚,每个奶牛对每个棚都有一个喜爱程度.当然啦,棚子也是有脾气的,并不是奶牛想住进来就住进来,超出棚 ...

  3. POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】

    Optimal Milking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Sub ...

  4. [ACM] POJ 3686 The Windy&#39;s (二分图最小权匹配,KM算法,特殊建图)

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

  5. poj 3686(拆点+最小权匹配)

    题目链接:http://poj.org/problem?id=3686 思路:显然工件为X集,机器为Y集合.由于每个机器一次只能加工一个部件,因此我们可以将一台机器拆成N个点,至于部件与机器之间连多大 ...

  6. poj 2195(KM求最小权匹配)

    题目链接:http://poj.org/problem?id=2195 思路:我们都知道KM使用来求最大权匹配的,但如果要求最小权匹配,只需把图中的权值改为负值,求一次KM,然后权值和取反即可. ht ...

  7. 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)

    [POJ 2400] Supervisor, Supervisee(KM求最小权匹配) Supervisor, Supervisee Time Limit: 1000MS   Memory Limit ...

  8. 【POJ 2195】 Going Home(KM算法求最小权匹配)

    [POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  9. poj3565 Ants km算法求最小权完美匹配,浮点权值

    /** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...

随机推荐

  1. 实验十四_访问CMOS RAM

    编程:以"年/月/日 时:分:秒"的格式,显示当前的日期,时间. 注意:CMOS RAM中存储着系统的配置信息,除了保存时间信息的单元外,不要向其他的单元写入内容,否则将引起一些系 ...

  2. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-9-10 移除平台与视差滚动

    9.9 移除场景之外的平台 用为平台是源源不断的产生的,如果不注意销毁,平台就将越积越多,虽然在游戏场景中看不到.几十个还看不出问题,那几万个呢?几百万个呢? 所以我们来看看怎么移除平台,那什么样的平 ...

  3. .NET: 防止多个应用程序同时开

    用到了Mutex这个类,直接看代码~ using System; using System.Collections.Generic; using System.Linq; using System.W ...

  4. poj: 2255

    跟LEETCODE的preorder,inorder转postorder题很像 #include <iostream> #include <stdio.h> #include ...

  5. cordova3.X 运用grunt生成plugin自定义插件骨架

    Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.Cordova还提供了一组统一的JavaScript类库,以及为这些 ...

  6. Codeforces Round #312 (Div. 2) E. A Simple Task

    题目大意就是给一个字符串,然后多个操作,每次操作可以把每一段区间的字符进行升序或者降序排序,问最终的字符串是多少. 一开始只考虑字符串中字符'a'的情况,假设操作区间[L,R]中有x个'a',那么一次 ...

  7. 下拉框分组显示optgroup

    <select> <optgroup label="语言"> <option>中文</option> <option>英 ...

  8. UIView属性及方法

    @property(nonatomic) CGFloat alpha //设置视图的透明度 //透明度的设置从最小0.0到1.0 ,1.0为完全不透明, //其中这个属性只影响当前视图,并不会影响其子 ...

  9. Delphi 的各版本定义,用于预编译参数中,避免忘记备忘之

    DELPHI的版本宏: VER80 - Delphi 1 VER90 - Delphi 2 VER100 - Delphi 3 VER120 - Delphi 4 VER130 - Delphi 5 ...

  10. codereview

    http://www.cnblogs.com/wenhx/p/How-We-Code-Review.htmlhttp://www.cnblogs.com/mindwind/p/5639008.html ...