博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JZOJ6299] 2019.08.12【NOIP提高组A】工厂
阅读量:5291 次
发布时间:2019-06-14

本文共 1188 字,大约阅读时间需要 3 分钟。

题目大意

工厂内每个人只会操作一些机器。

他们会以随机的顺序来,每次选任意一台机器来操作。
一台机器只能由一个工人来操作。
可以花费一的代价来使某个工人学会一种机器。
问花费最少的代价,使得在所有的情况下每个人都能操纵一台机器。


正解

这题可以转化成个二分图。而答案一定满足:==所有联通块都是个完全二分图==。

我们要用最少的代价来造出这样的二分图。
预处理出所有的联通块,每个联通块用\((x,y)\)表示,意味着左边有\(x\)个,右边有\(y\)个。
于是就有了下面这个状压DP:\(f_{S,i}\)表示\(S\)集中的联通块都被使用了,其中完成了的联通块的\(x\)之和为\(i\)的最小边数。
等等,这个状态会不会存不下?
实际上,对于相同的\((x,y)\),我们只关心数量,所以可以进一步压缩。然后状态的数量就变得少了很多。
最后的答案记得要减去原来就有的边数。


代码

using namespace std;#include 
#include
#include
#define N 33inline void update(int &x,int y){x>y?x=y:0;}int n;char can[N][N];bool vis[N][2];int cntl,cntr,have;void find(int x,bool k){ vis[x][k]=1; if (k==0){ cntl++; for (int i=1;i<=n;++i) if (can[x][i]=='1' && !vis[i][1]) find(i,1); } else{ cntr++; for (int i=1;i<=n;++i) if (can[i][x]=='1' && !vis[i][0]) find(i,0); }}int sc[N][N];struct State{ int x,y; int num;} lis[N];int m;int pro[N];int chose[N];int f[200000][N];void dfs(int k,int s,int x,int y){ if (k>m){ if (s==0) f[0][0]=0; for (int j=0;j

总结

居然还有如此鬼畜的DP……

转载于:https://www.cnblogs.com/jz-597/p/11421062.html

你可能感兴趣的文章
jqery总结
查看>>
Lodop获取客户端主网卡ip地址是0.0.0.0
查看>>
VSCODE更改文件时,提示:EACCES: permission denied的解决办法(mac电脑系统)
查看>>
web前端之路,js的一些好书(摘自聂微东 )
查看>>
【模板】对拍程序
查看>>
微信小程序开发初体验
查看>>
dos批处理(bat)运行exe
查看>>
关键字
查看>>
Pycharm安装Markdown插件
查看>>
上传图片并预览
查看>>
哈夫曼编码_静态库
查看>>
【转】redo与undo
查看>>
C#更新程序设计
查看>>
常用Request对象获取请求信息
查看>>
解决升级系统导致的 curl: (48) An unknown option was passed in to libcurl
查看>>
Shell命令-内置命令及其它之watch、date
查看>>
Java Session 介绍;
查看>>
spoj TBATTLE 质因数分解+二分
查看>>
Django 模型层
查看>>
第8章-方法
查看>>