hdu1150 Machine Schedule
2013-08-14 20:28
363 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150
题目大意:有两台机器A,B,分别有n,m种模式,有k个任务要处理,每个任务在机器A或B上处理需要一种特殊模式,例任务0在机器A上处理需模式2,在机器B上处理需模式1,任务1在机器A上处理需模式3,在机器B上处理需模式4。每个任务可以在机器A或B上执行,任务执行顺序可以任意调动,机器A和B的初始模式都是0,机器没切换一种模式需重启一次。求执行完这些任务,机器A,B所需重启的最少次数。
题目解析:根据此题要求分析,我们可以建一个二部图,节点分别为机器A和机器B的模式,每个人任务一条边,那么便转换成求用最少的节点覆盖所有的边(既用最少的机器模式解决所有的任务),有最少点覆盖=二分图最大匹配。那么本题既求二分图最大匹配即可。
题目大意:有两台机器A,B,分别有n,m种模式,有k个任务要处理,每个任务在机器A或B上处理需要一种特殊模式,例任务0在机器A上处理需模式2,在机器B上处理需模式1,任务1在机器A上处理需模式3,在机器B上处理需模式4。每个任务可以在机器A或B上执行,任务执行顺序可以任意调动,机器A和B的初始模式都是0,机器没切换一种模式需重启一次。求执行完这些任务,机器A,B所需重启的最少次数。
题目解析:根据此题要求分析,我们可以建一个二部图,节点分别为机器A和机器B的模式,每个人任务一条边,那么便转换成求用最少的节点覆盖所有的边(既用最少的机器模式解决所有的任务),有最少点覆盖=二分图最大匹配。那么本题既求二分图最大匹配即可。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 110 int map[MAX][MAX]; int link[MAX],vis[MAX]; int n,m,k; int dfs(int x) { int i; for (i=1;i<=m;i++) { if (map[x][i]&&!vis[i]) { vis[i]=1; if (link[i]==-1||dfs(link[i])) { link[i]=x; return 1; } } } return 0; } int main() { while (scanf("%d",&n)!=EOF) { if (n==0) break; int i,j,u,v,w,ans=0; memset(map,0,sizeof(map)); memset(link,-1,sizeof(link)); scanf("%d%d",&m,&k); for (i=0;i<k;i++) { scanf("%d%d%d",&w,&u,&v); if (u==0||v==0) //如果任务处理在任意机器上的模式为0,那么不需要处理,因为初始模式就为0 continue; map[u][v]=1; } for (i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); ans+=dfs(i); } printf("%d\n",ans); } }
相关文章推荐
- HDU1150最小顶点覆盖
- dfs,bfs的二分匹配模板(模板题hdu1150)
- hdu1150 Machine Schedule 经典二分匹配题目
- HDU1150 Machine Schedule
- hdu1150 二分图匹配的最小点覆盖
- HDU1150 Machine Schedule
- hdu1150 Machine Schedule 最小点覆盖
- hdu1150(二分图最小顶点覆盖)
- hdu1150
- hdu1150
- hdu1150
- hdu1150 最小点覆盖
- HDU1150 最小顶点覆盖
- HDU1150最小点覆盖
- 【图算法之二分图】HDU1150---Machine Schedule
- HDU1150:Machine Schedule(最小点覆盖)
- HDU_Steps6.3 二分图 HDU1054 HDU1068 HDU1150 HDU1151 HDU1498 HDU1528 HDU1507 HDU2768
- 最小路径覆盖(最小边覆盖&&最小点覆盖)hdu1150
- 【hdu1150】【Machine Schedule】二分图最小点覆盖+简单感性证明
- 匈牙利算法之hdu1150