二分匹配之HDU1150 Machine Schedule
2015-09-29 18:00
274 查看
求最小点覆盖数。
唯一需要注意的是起始机器都为0,所以输入时候需要0状态能完成的工作就可以直接完成,不需要放到二分匹配里面去了。
唯一需要注意的是起始机器都为0,所以输入时候需要0状态能完成的工作就可以直接完成,不需要放到二分匹配里面去了。
#include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <math.h> #include <algorithm> #include <stack> #include <queue> #include <vector> #include <map> #include <set> #include <string> #include <sstream> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long LL; const double pi=4.0*atan(1.0); const int MAXN=10005; vector<int> g[MAXN]; int used[MAXN],linker[MAXN]; int uN; int dfs(int u) { for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(!used[v]) { used[v]=1; if(linker[v]==-1||dfs(linker[v])) { linker[v]=u; return 1; } } } return 0; } int hungary() { memset(linker,-1,sizeof(linker)); int ans=0; for(int i=1;i<uN;i++) { memset(used,0,sizeof(used)); if(dfs(i)) ans++; } return ans; } int main() { int n,m; int i,j,k; int x,y; while(scanf("%d",&n)!=EOF) { if(n==0) return 0; scanf("%d%d",&m,&k); for(i=0;i<=n;i++) g[i].clear(); for(i=0;i<k;i++) { scanf("%d%d%d",&j,&x,&y); if(x==0||y==0) continue; g[x].push_back(y); } uN=n; printf("%d\n",hungary()); } return 0; }
相关文章推荐
- table td 文本自动截断 text-overflow:ellipsis
- CSS3 自定义动画(animation)
- 自定义控件
- javascript实现动态添加内容与删除内容
- systemd详解
- C/C++程序员必须熟练应用的开源项目
- UVALive 3983 Robotruck (单调队列,dp)
- 解密Redis持久化
- java7:数组
- nyoj 单调递增子序列(二) 214 (LIS 优化)
- EventBus源码注释分析
- MyEclipse在导入已有包时报红色下划线
- Struts 2 validator param list
- dex2jar 反编译 apk
- 开机出现checking file system on C或者D E F盘符的解决方法
- PHP接口的实现(转)(笔记)
- 浅谈C++多态性
- C# webbrowser中json后缀的文件不能显示的问题
- 佛佑善人:般若波罗蜜多心经
- Ubuntu 目录