思路来自:http://www.cnblogs.com/kane0526/p/3263248.html

题意:有n个公司,m个任务,每个公司做每个任务都有一个效率值,最开始每个公司都指派了一个任务,现在要你重新给每个公司分配一个任务(一个任务只能分配给一家公司),使得所有公司任务的效率值最大,并且改变的原始任务最少。

思路:把每条边的权值扩大k倍(k>n),然后属于原始任务的边权值+1,权值加1是为了当两条边权值相同时,更优先选择属于原始任务的边,扩大k倍的巧妙之处不仅在于KM匹配时优先选择原始边所得答案除k得到原始答案,而且结果对k求余就是保留的就是原始任务的数量。

这题将权值扩大的思想和之前最小割求割边数的那个有点像,但是自己没想到,看了才想起来

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <utility>
#include <queue>
#include <stack>
using namespace std;const int INF=1e9;
const double eps=1e-6;
const int N = 550;int nx,ny;
int g[N][N];
int linker[N],lx[N],ly[N];
int slack[N];
int visx[N],visy[N];int n,m;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(linker[y]==-1||DFS(linker[y])){linker[y]=x;return true;}}else if(slack[y]>tmp)slack[y]=tmp;}return false;
}int KM()
{memset(linker,-1,sizeof(linker));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,false,sizeof(visx));memset(visy,false,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 res = 0, cnt = 0;for(int i=0;i<ny;i++){if(linker[i]==-1)continue;res += g[linker[i]][i];cnt++;}if(cnt!=nx) return -1;return res;
}int main(){int i,j;while(scanf("%d%d",&nx,&ny)!=EOF){for(i=0;i<nx;i++){for(j=0;j<ny;j++){g[i][j]=-INF;}}for(i=0;i<nx;i++){for(j=0;j<ny;j++){int x;scanf("%d",&x);g[i][j]=max(x*100,g[i][j]);}}int sum=0; for(i=0;i<nx;i++){int x;scanf("%d",&x);x--;sum+=g[i][x]/100;g[i][x]++;//使得权相等的时候,优先选取已经存在的,那么ans%100就是匹配中,保留的边数 }int ans=KM();printf("%d %d\n",nx-ans%100,ans/100-sum);}return 0;
}

hdu2853 Assignment相关推荐

  1. HDU2853 Assignment KM

    原文链接http://www.cnblogs.com/zhouzhendong/p/8284105.html 题目传送门 - HDU2853 题意概括 (来自谷歌翻译) 题解 这是一道好题. 我们首先 ...

  2. MATH6005 Final Assignment MATH6005 2018-19

    MATH6005 2018-19 MATH6005 Final Assignment 1. Instructions Your Assignment 3 should consist of three ...

  3. React | Expected an assignment or function call and instead saw.....

      记一个 react 程序报的错误:Expected an assignment or function call and instead saw an expression,直译是:需要是一个函数 ...

  4. python list越界原因(list assignment index out of range)

    分析: list assignment index out of range:列表超过限制 情况1:list[index]index超出范围 情况2:list是一个空的,没有一个元素,进行list[0 ...

  5. SAP HUM 如何把HU号码与Outbound Delivery 解除Assignment?

    SAP HUM 如何把HU号码与Outbound Delivery 解除Assignment? 比如如下交货单, 完成了WM层面的拣配,分配了2个HU号码.完成了过账后来取消了PGI,并且使用LT09 ...

  6. 不允许 ASSIGNMENT 语句中包含 FOR XML 子句。

    DECLARE @guidList NVARCHAR(max) SELECT   @guidList=( CAST(OrderGUID AS nvarchar(max)) +',')  FROM Or ...

  7. python UnboundLocalError: local variable 'log_f' referenced before assignment 错误

    在写一个python程序,用finally处理异常的时候,报了"UnboundLocalError: local variable 'log_f' referenced before ass ...

  8. CS224n Assignment 2

    为什么80%的码农都做不了架构师?>>>    本文由码农场同步,最新版本请查看原文:http://www.hankcs.com/nlp/cs224n-assignment-2.ht ...

  9. assignment makes pointer from integer without a...

    2019独角兽企业重金招聘Python工程师标准>>> warning: assignment makes pointer from integer without a cast 今 ...

最新文章

  1. 参加Python培训班能找到工作吗?
  2. java 程序运行过程 简介
  3. php,http_build_query,乱码
  4. c2064 项不会计算为接受0个参数的函数_无网格法理论与Matlab程序设计(6)——传统径向基点插值(RPIM)形函数...
  5. MySQL关闭查询缓存(QC)的两种方法
  6. 于数据交换格式XML和JSON的比较
  7. apollo持久化sentinel_Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则
  8. O_RDWR, O_CREAT等open函数标志位在哪里定义?
  9. C++primer第十章 泛型算法 10.4 再探迭代器 10.5 泛型算法结构
  10. JQuery文件上传控件Uploadify文档
  11. c语言中整形精确到后面几位,C语言中普通整型变数在记忆体中占几个位元组
  12. 16进制 dat matlab_MATLAB中的常量与变量
  13. FreeRTOS 配置文件
  14. java io 和nio_java对比IO和NIO的文件读写性能测试
  15. 拼音加加在双拼状态下在输入数字后的标点不正常的解决方式
  16. Dexpot 虚拟桌面软件(推荐)
  17. 使用 KNX Manufacturer Tool 编写 knx 数据库的步骤
  18. 26、python数据表透视分析、交叉分析、实现透视表功能
  19. 54. Java序列化三连问,是什么?为什么需要?如何实现?
  20. SQL中case的使用方法

热门文章

  1. Linux应用与ubuntu基本操作-曹国辉-专题视频课程
  2. PPT的一些使用技巧
  3. 雷达基本组成(以单基地脉冲雷达为例)
  4. c++栈和队列的应用(停车问题)
  5. CF 780 D. Maximum Product Strikes Back
  6. [Error] _lv_inv_area: detected modifying dirty areas in render (in lv_refr.c line #212)
  7. $merge()合并两个数组方法
  8. AIFF和AIFF-C音频交换文件格式的简单介绍
  9. 【转帖】应用软件系统架构设计的七种武器
  10. 高德地图之Python爬取上海市所有道路轮廓坐标