恩 , 题是好题 , 一道经典KM算法题 , 只是刚开始读错题了,感觉思路没错但就是过不了样例,受不了了就上网查了一下题意,果然题意理解错了 ,改了一下输入,又加了个标记数组就这样的过了~  唉,由此可以看出学好英语是多么的重要!

题目大意是:有N个订单要在M个机器上加工,有一个N*M的矩阵描述其加工时间,同一时间内每台机器只能加工一个订单,问加工完所有订单后,时的平均时间最小。

思路就是:

将订单作为二分图中X部的点,总共N个。

将每个机器拆成N个点作为二分图中Y部的点,总共N*M个。

第J个机器的第P个点代表,使用机器 J进行倒数第P次加工。

假设我们按顺序在J机器上工件i1 , i2 , i3.....ik个工件,则总共需要花费i1*k + i2*(k-1) + i3*(k-2) +......+ ik*1;

所以我们对于X中每个点I,Y中每个点(J,P),连接一条hour[I,J]*P权值的边。

接下来进行二分图最佳匹配即可。

不过还是有收获的,至少对KM算法有了一点新的认识,KM算法类似于求图的最短路,只不过这个图要是二分图,并且两个点之间不能有其他的点,然后就是和求最短路一样的套用模板了。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#define maxx 55
#define INF 0xffffff
using namespace std;int mm[maxx][maxx*maxx] , hour[maxx][maxx] ;
int lx[maxx] , ly[maxx*maxx] ;
int vistx[maxx] , visty[maxx*maxx] ;
int linkx[maxx*maxx] , linky[maxx*maxx] ;
int N , M ;void init()
{int i , j , k ;memset( hour , 0 , sizeof ( hour ));memset( mm , 0 , sizeof ( mm ));for ( i = 0 ; i < N ; i++ )for ( j = 0 ; j < M ; j++ )scanf ( "%d", &hour[i][j] );for ( i = 0 ; i < N ; i++ )//处理输入,将M台机器每台分为N份for ( j = 0 ; j < M ; j++ )for ( k = 0 ; k < N ; k++ )mm[i][j*N+k] = hour[i][j] * ( k+1 );M = N * M ;//二分图中Y集中共有N*M个点
    memset( lx , 127 , sizeof ( lx ));//将X集中点的顶标置为最大memset( ly , 0 , sizeof ( ly ));for ( i = 0 ; i < N ; i++ )for ( j = 0 ; j < M ; j++ )if ( mm[i][j] < lx[i] )lx[i] = mm[i][j] ;//初始化X集中点的顶标
}int find ( int x )
{int i ;vistx[x] = 1;for ( i = 0 ; i < M ; i++ )if ( !visty[i] && lx[x] + ly[i] == mm[x][i] ){visty[i] = 1 ;if ( linkx[i] == -1 || find ( linkx[i] )){linkx[i] = x;linky[x] = i ;return 1;}}return 0;
}void KM()
{int i  , j , k ;memset( linkx , -1 , sizeof ( linkx ));memset( linky , -1 , sizeof ( linky ));for ( i = 0 ; i < N ; i++ ){while ( 1 ){memset( vistx , 0 , sizeof ( vistx ));memset( visty , 0 , sizeof ( visty ));if ( find ( i ))//判断是否为完美匹配break;int minn = INF ;for ( j = 0  ; j < N ; j++ )if ( vistx[j] ){for ( k = 0 ; k < M ; k++ )if ( !visty[k] && mm[j][k] - lx[j] - ly[k] < minn )minn = mm[j][k] - lx[j] - ly[k] ;}for ( j = 0 ; j < N ; j++ )//调整顶标if ( vistx[j] )lx[j] += minn ;for ( j = 0 ; j < M ; j++ )if ( visty[j] )ly[j] -=minn ;}}int sum = 0;for ( i = 0 ; i < N ; i++ )sum += mm[i][linky[i]];//cout<<sum<<endl;printf ( "%.6lf\n" , 1.0 * sum / N );
}int main()
{int cas ;scanf ( "%d" , &cas );while ( cas-- ){scanf ( "%d%d" , &N , &M );init();KM();}return 0;
}

转载于:https://www.cnblogs.com/misty1/archive/2012/05/19/2508980.html

poj 3686 The Windy's( KM算法 )相关推荐

  1. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了-- 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  2. POJ 3686 The Windy's

    POJ_3686 看到这个题目后,首先一个思路就是相当于安排每个东西是第几次交给哪个机器做,这样就可以把每个机器拆成N个点当成二分图匹配的题目来做了.但是遇到的最大的问题就是,每个东西的总制造时间会依 ...

  3. KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home

    最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大.解决这个问题可以用KM算法.理解KM算法需要首先理解"可行顶标"的概念.可行顶标是指关于二分图 ...

  4. 二分图最佳匹配 KM算法 Hdu2255奔小康赚大钱 + Poj 3565 Ants

    2014-10-4 更新 在最下面增加了基于邻接表的模板 理论:http://blog.sina.com.cn/s/blog_691ce2b701016reh.html http://philosci ...

  5. KM算法(DFS版,优化DFS版,BFS版)

    KM算法的前提是图存在一个完备匹配,因此用于二分图的最佳匹配问题.如果是最大权匹配问题,可以通过加权值为0的边来可以将图的最佳匹配与最大全匹配统一起来:如果是最小权匹配问题,可以通过加权值为-INF的 ...

  6. 2019 ICPC Asia Nanjing Regional J.Spy(KM算法O(n^3)板子题)

    整理的算法模板合集: ACM模板 前面好几段又在讲故事- 题目大意: a[i]表示对手的每个队伍战斗力 p[i]表示打败对手后获得的分数 b[i]表示我方第一种人的战斗力 c[i]表示我方第二种人的战 ...

  7. 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))

    整理的算法模板合集: ACM模板 匈牙利算法又称为 KM 算法,可以在 O(n3)O(n^3)O(n3) 时间内求出二分图的 最大权完美匹配 . 考虑到二分图中两个集合中的点并不总是相同,为了能应用 ...

  8. hdu 2255 奔小康赚大钱--KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  9. 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法

    网上搜了好多KM算法的文章,都写得云里雾里.看了半天之后,我终于看懂了.其实KM算法非常简单,只要会匈牙利算法了,一下就能看懂KM算法. 如果大家对自己的匈牙利算法不够自信的话,可以先复习一下,放上我 ...

最新文章

  1. 用C#制作新闻阅读器(电脑报2005年3月14日 第10期)
  2. latex的资料ftp
  3. Python 中list中所有值加和_Python 中去除列表中重复元素的5种方法
  4. linux定时任务小程序,linux定时任务
  5. SharePoint 2013创建WCF REST Service
  6. MATLAB机械动力分析,基于MATLAB的柔性机械臂动力学分析.pdf
  7. innodb system table
  8. 青岛VR全景制作免费方法教程
  9. 1484: 青蛙(四)
  10. ArrayList和LinkedList的底层源码之我见
  11. android的前景
  12. (02)Cartographer源码无死角解析-(32) LocalTrajectoryBuilder2D::AddRangeData()→点云的体素滤波
  13. 东南大学计算机学院程茜雅,满满的黑科技,这份录取通知书火了!
  14. Shell 编程 ~ 从入门到入坑。
  15. “中国探月工程”,“长征三号火箭”,“月球车”,英语怎么说?
  16. 呆在家睡觉,倒不如在家学习
  17. 基于Python高校图书馆图书管理系统的设计与实现(PyCharm,MySQL)
  18. 计算机vb考试程序试题,计算机二级VB考试练习题
  19. 教育技术学课本的一些知识总结
  20. 关于硅胶按键丝印的表面问题及解决办法

热门文章

  1. 【下载安装】ps软件下载免费中文版及安装详细步骤教程(photoshop软件下载)
  2. easyrecovery2023免费版电脑数据恢复软件下载功能介绍
  3. Android Killer(反编译工具)技巧
  4. 前端生成pdf的js库-pdfmake.js的简单使用
  5. MongoDB 添加、查询(条件查询、排序、分页、返回指定字段)、修改、删除数据、聚合aggregate
  6. shell foreach
  7. [计算机网络笔记14] IPv4地址—定长子网掩码和变长子网掩码
  8. 基于JAVA小微企业人事管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  9. STM32———高级定时器的死区时间计算方法
  10. python 各类距离公式实现