博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1150 Machine Schedule (二分图最小点覆盖)
阅读量:5061 次
发布时间:2019-06-12

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

题目链接:

有两个机器a和b,分别有n个模式和m个模式。下面有k个任务,每个任务需要a的一个模式或者b的一个模式完成。

两个机器初始都是0模式,一个机器转换一个模式需要重启一次。问你最少需要重启几次能完成所有的任务。

不太明显的二分匹配,将每个任务的两个模式连线,大概就能看出来这是个最小点覆盖问题。

1 /* 2 将下面任务的a状态和b状态连边,线的个数就是任务个数。 3 要使重启次数最少,那么就要使选择的点最少而且覆盖所有的边 4 所以问题转化为二分图求最小点覆盖数 5 */ 6 //二分图中 最小点覆盖 = 最大匹配数 7 #include 
8 #include
9 #include
10 #include
11 using namespace std;12 vector
G[105];13 int match[105];14 bool vis[105];15 16 bool dfs(int u) {17 for(int i = 0 ; i < G[u].size() ; ++i) {18 int v = G[u][i];19 if(!vis[v]) {20 vis[v] = true;21 if(match[v] == -1 || dfs(match[v])) {22 match[v] = u;23 return true;24 }25 }26 }27 return false;28 }29 30 int hungry(int n) {31 int res = 0;32 for(int i = 1 ; i <= n - 1 ; ++i) {33 memset(vis , false , sizeof(vis));34 if(dfs(i))35 res++;36 }37 return res;38 }39 40 int main()41 {42 int n , m , k , id , u , v;43 while(~scanf("%d %d %d" , &n , &m , &k) && n) {44 for(int i = 1 ; i <= 100 ; ++i) {45 G[i].clear();46 match[i] = -1;47 vis[i] = false;48 }49 for(int i = 0 ; i < k ; ++i) {50 scanf("%d %d %d" , &id , &u , &v);51 G[u].push_back(v);52 }53 printf("%d\n" , hungry(n));54 }55 return 0;56 }

 

转载于:https://www.cnblogs.com/Recoder/p/5670852.html

你可能感兴趣的文章
bzoj1230 开关灯 线段树
查看>>
LinearLayout
查看>>
学习python:day1
查看>>
css3动画属性
查看>>
第九次团队作业-测试报告与用户使用手册
查看>>
Mongodb 基本命令
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
软件目录结构规范
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
HEVC播放器出炉,迅雷看看支持H.265
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
Eclipse 调试的时候Tomcat报错启动不了
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android入门之文件系统操作(二)文件操作相关指令
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>