hdu2853 Assignment
思路来自: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相关推荐
- HDU2853 Assignment KM
原文链接http://www.cnblogs.com/zhouzhendong/p/8284105.html 题目传送门 - HDU2853 题意概括 (来自谷歌翻译) 题解 这是一道好题. 我们首先 ...
- MATH6005 Final Assignment MATH6005 2018-19
MATH6005 2018-19 MATH6005 Final Assignment 1. Instructions Your Assignment 3 should consist of three ...
- React | Expected an assignment or function call and instead saw.....
记一个 react 程序报的错误:Expected an assignment or function call and instead saw an expression,直译是:需要是一个函数 ...
- python list越界原因(list assignment index out of range)
分析: list assignment index out of range:列表超过限制 情况1:list[index]index超出范围 情况2:list是一个空的,没有一个元素,进行list[0 ...
- SAP HUM 如何把HU号码与Outbound Delivery 解除Assignment?
SAP HUM 如何把HU号码与Outbound Delivery 解除Assignment? 比如如下交货单, 完成了WM层面的拣配,分配了2个HU号码.完成了过账后来取消了PGI,并且使用LT09 ...
- 不允许 ASSIGNMENT 语句中包含 FOR XML 子句。
DECLARE @guidList NVARCHAR(max) SELECT @guidList=( CAST(OrderGUID AS nvarchar(max)) +',') FROM Or ...
- python UnboundLocalError: local variable 'log_f' referenced before assignment 错误
在写一个python程序,用finally处理异常的时候,报了"UnboundLocalError: local variable 'log_f' referenced before ass ...
- CS224n Assignment 2
为什么80%的码农都做不了架构师?>>> 本文由码农场同步,最新版本请查看原文:http://www.hankcs.com/nlp/cs224n-assignment-2.ht ...
- assignment makes pointer from integer without a...
2019独角兽企业重金招聘Python工程师标准>>> warning: assignment makes pointer from integer without a cast 今 ...
最新文章
- 参加Python培训班能找到工作吗?
- java 程序运行过程 简介
- php,http_build_query,乱码
- c2064 项不会计算为接受0个参数的函数_无网格法理论与Matlab程序设计(6)——传统径向基点插值(RPIM)形函数...
- MySQL关闭查询缓存(QC)的两种方法
- 于数据交换格式XML和JSON的比较
- apollo持久化sentinel_Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则
- O_RDWR, O_CREAT等open函数标志位在哪里定义?
- C++primer第十章 泛型算法 10.4 再探迭代器 10.5 泛型算法结构
- JQuery文件上传控件Uploadify文档
- c语言中整形精确到后面几位,C语言中普通整型变数在记忆体中占几个位元组
- 16进制 dat matlab_MATLAB中的常量与变量
- FreeRTOS 配置文件
- java io 和nio_java对比IO和NIO的文件读写性能测试
- 拼音加加在双拼状态下在输入数字后的标点不正常的解决方式
- Dexpot 虚拟桌面软件(推荐)
- 使用 KNX Manufacturer Tool 编写 knx 数据库的步骤
- 26、python数据表透视分析、交叉分析、实现透视表功能
- 54. Java序列化三连问,是什么?为什么需要?如何实现?
- SQL中case的使用方法
热门文章
- Linux应用与ubuntu基本操作-曹国辉-专题视频课程
- PPT的一些使用技巧
- 雷达基本组成(以单基地脉冲雷达为例)
- c++栈和队列的应用(停车问题)
- CF 780 D. Maximum Product Strikes Back
- [Error] _lv_inv_area: detected modifying dirty areas in render (in lv_refr.c line #212)
- $merge()合并两个数组方法
- AIFF和AIFF-C音频交换文件格式的简单介绍
- 【转帖】应用软件系统架构设计的七种武器
- 高德地图之Python爬取上海市所有道路轮廓坐标