1、有两台机器A和B以及N个需要运行的任务。A机器有n种不同的模式,B机器有m种不同的模式,而每个任务都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器B需要设置为模式yi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。

2、最小点覆盖数 = 最大匹配数(结论。暂时不会证明。)

这道题主要在于转化:A机器的n种模式看成二分图的X集合,B机器的m种模式看成二分图的Y集合,每个任务看作一条边(即任务 i 看作边xi--yi),这样一来,所有的任务都变成了二分图中的边,然后求二分图的最小点覆盖数即可。

3、

/*
顶点编号从0开始的
邻接矩阵(匈牙利算法)
二分图匹配(匈牙利算法的DFS实现)(邻接矩阵形式)
初始化:g[][]两边顶点的划分情况
建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配
g没有边相连则初始化为0
uN是匹配左边的顶点数,vN是匹配右边的顶点数
左边是X集,右边是Y集
调用:res=hungary();输出最大匹配数
优点:适用于稠密图,DFS找增广路,实现简洁易于理解
时间复杂度:O(VE)
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; const int MAXN=;
int uN,vN;//u,v 的数目,使用前面必须赋值
int g[MAXN][MAXN];//邻接矩阵,记得初始化
int linker[MAXN];//linker[v]=u,表示v(右边Y集合中的点)连接到u(左边X集合中的点)
bool used[MAXN];
bool dfs(int u){//判断以X集合中的节点u为起点的增广路径是否存在
for(int v=;v<vN;v++)//枚举右边Y集合中的点
if(g[u][v]&&!used[v]){//搜索Y集合中所有与u相连的未访问点v
used[v]=true;//访问节点v
if(linker[v]==-||dfs(linker[v])){//是否存在增广路径
//若v是未盖点(linker[v]==-1表示没有与v相连的点,即v是未盖点),找到增广路径
//或者存在从与v相连的匹配点linker[v]出发的增广路径
linker[v]=u;//设定(u,v)为匹配边,v连接到u
return true;//返回找到增广路径
}
}
return false;
}
int hungary(){//返回最大匹配数(即最多的匹配边的条数)
int res=;//最大匹配数
memset(linker,-,sizeof(linker));//匹配边集初始化为空
for(int u=;u<uN;u++){//找X集合中的点的增广路
memset(used,false,sizeof(used));//设Y集合中的所有节点的未访问标志
if(dfs(u))res++;//找到增广路,匹配数(即匹配边的条数)+1
}
return res;
} int main(){
int n,m,k;
int i,ans;
int id,u,v;
while(~scanf("%d",&n)){
if(n==)break;
scanf("%d%d",&m,&k);
uN=n;//匹配左边的顶点数
vN=m;//匹配右边的顶点数
memset(g,,sizeof(g));//二分图的邻接矩阵初始化
for(i=;i<k;++i){
scanf("%d%d%d",&id,&u,&v);
if(u>&&v>)g[u][v]=;//u为0或v为0时不需要代价
}
ans=hungary();
printf("%d\n",ans);
}
}

最新文章

  1. 洛谷 P2726 阶乘 Factorials Label:Water
  2. bzoj4282慎二的随机数列
  3. centos6 pyotp bug修复
  4. Java: Difference between ArrayList and LinkedList
  5. [反汇编练习] 160个CrackMe之008
  6. 《Java数据结构与算法》笔记-CH3简单排序
  7. 异常处理与调试4 - 零基础入门学习Delphi53
  8. MDX笔记
  9. hdu1116有向图判断欧拉通路判断
  10. 使用reqire.js 生成二维码
  11. Scala编程入门---数组操作之数组转换
  12. C程序员眼里的Python
  13. Java8 Lambda表达式原理扫盲
  14. 关于rabbitmq的介绍
  15. PHP Math 函数 mt_rand() 使用 Mersenne Twister 算法返回随机整数。
  16. npm下载指定版本的插件
  17. React文档(三)介绍JSX
  18. springfox+swagger2生成API文档
  19. Human Interface Device (HID) Class Decoder
  20. Oracle 11gR2 rac 的各项服务说明

热门文章

  1. Fidder详解-抓取HTTPS清求(Web/App)抓包分析(靠谱篇)
  2. bzoj1059:[ZJOI2007]矩阵游戏【二分图匹配】
  3. bzoj5090组题 分数规划
  4. POJ 2965 The Pilots Brothers&#39; refrigerator【BFS+状压 Or 脑洞】
  5. gitlab上fork的项目如何获取源更新
  6. P2839 畅通工程
  7. JAVA_构造方法
  8. mybatis几种开发方式
  9. java 基础 1 final关键字
  10. makefile的语法及写法(二)