hud1150二分图最小顶点覆盖
2013-04-12 21:25
267 查看
弱菜需要更加多的学习!!
英文题还是给出题意吧,英文太头疼了。。。
题意: A机器n种工作模式,B机器m种工作模式,共有k个任务。
(i,x,y)代表:任务i可由A机器x模式或者B机器y模式完成。
任务顺序可以随便改动,如果A或者B机器需要更换模式,则需要重启机器。
求完成工作,需要最少启动机器次数。
解题思路: 画出二分图,易知该问题为最小点覆盖问题,根据König定理:最小顶点覆盖 = 最大匹配数
给出大牛的证明:
最小点覆盖定义:假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖所有的边。
算了,还是给链接吧- -。。。:http://www.matrix67.com/blog/archives/116
我的代码:
英文题还是给出题意吧,英文太头疼了。。。
题意: A机器n种工作模式,B机器m种工作模式,共有k个任务。
(i,x,y)代表:任务i可由A机器x模式或者B机器y模式完成。
任务顺序可以随便改动,如果A或者B机器需要更换模式,则需要重启机器。
求完成工作,需要最少启动机器次数。
解题思路: 画出二分图,易知该问题为最小点覆盖问题,根据König定理:最小顶点覆盖 = 最大匹配数
给出大牛的证明:
最小点覆盖定义:假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖所有的边。
算了,还是给链接吧- -。。。:http://www.matrix67.com/blog/archives/116
我的代码:
#include<iostream> #include<cstring> using namespace std; int map[111][111]; int tmp[111]; bool flag[111]; int n,m; int DFS(int x) { for(int i=1;i<=m;i++) //机器B集合 { if(map[x][i]&&!flag[i]) //未被匹配 { flag[i]=true; if(tmp[i]==-1||DFS(tmp[i])) { tmp[i]=x; return 1; } } } return 0; } int main() { int k,t,x,sum,y; while(cin>>n&&n!=0) { cin>>m>>k; memset(map,0,sizeof(map)); for(int i=0;i<k;i++) { cin>>t; cin>>x>>y; map[x][y]=1; } //求最大匹配 memset(tmp,-1,sizeof(tmp)); sum=0; for(int i=1;i<=n;i++) //匹配a机器 { memset(flag,0,sizeof(flag)); sum+=DFS(i); } cout<<sum<<endl; } return 0; }
相关文章推荐
- hud1150二分图最小顶点覆盖
- HDU1150-- Machine Schedule( 二分图最小顶点覆盖)
- hdu1150 Machine Schedule (二分图的最小顶点覆盖)
- hdu 1150二分图最小顶点覆盖
- HDU 1150 Machine Schedule(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)
- HDU 1150 二分图最小顶点覆盖 解题报告
- HDU-1054 Strategic Game(二分图最小顶点覆盖)
- 二分图相关拓展(抽象模型,最小顶点覆盖,边的最小覆盖,最大独立集,最大团)
- 二分图的最小顶点覆盖 和 最大独立集 和 最大团
- poj3041-Asteroids , 二分图的最小顶点覆盖数 = 最大匹配数
- 【二分图匹配(最小顶点覆盖)】hdu 1150 Machine Schedule(外:hdu 1054 Strategic Game)
- 二分图及二分图最小顶点覆盖 最大独立集
- hdu1150(二分图最小顶点覆盖)
- [hungary][最小顶点覆盖][二分图]hdu 1054
- poj 2226 二分图 最小顶点覆盖 “草泥马”
- HDU 1150 Machine Schedule (二分图最小点覆盖)
- pku3308 【论】如何将二分图顶点覆盖问题转化为最小割
- POJ 3020Antenna Placement(二分图最小顶点覆盖)
- poj 1325 二分图最小顶点覆盖(机器重启)
- hdu1498二分图最小顶点覆盖