二分匹配HDU1054 Strategic Game
2015-08-15 13:53
323 查看
最小点覆盖数,因为给你的是一棵树,所以一定构成二分图。
其次,压边的时候需要当成双向边处理,因为你是把一个集合内的点拆成两份来处理,就是对称的。
所以结果也需要除2。
其次,压边的时候需要当成双向边处理,因为你是把一个集合内的点拆成两份来处理,就是对称的。
所以结果也需要除2。
#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=1505; vector<int> g[MAXN]; int used[MAXN]; int 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() { int i; int ans=0; memset(linker,-1,sizeof(linker)); for(i=0;i<uN;i++) { memset(used,0,sizeof(used)); if(dfs(i)) ans++; } return ans; } int main() { int n,m,k; int x,y; int i,j; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) g[i].clear(); for(i=0;i<n;i++) { scanf("%d:(%d)",&x,&y); for(j=0;j<y;j++) { scanf("%d",&k); g[x].push_back(k); g[k].push_back(x); } } uN=n; printf("%d\n",hungary()/2); } return 0; }
相关文章推荐
- 函数调用
- 关于linux下svn日志问题
- 质数因子
- 设计模式的饕餮盛宴
- 深箸隋唐
- Java EE HTML5 WebSocket 示例
- C++基础---空类型
- CSS3伪类选择器:nth-child()
- mysql开发遇到的问题之1064错误代码
- 年会礼品
- Android textview 设置不同的字体大小和颜色
- Hadoop 原理总结
- test
- Spring MVC学习系列(1)之人生若只如初见
- 机器学习中的范数规则化之(一)L0、L1与L2范数 非常好,必看
- UVALive - 6322 The Swapping Game
- POJ2560 Freckles(prim最小生成树)
- FreeMarker入门教程
- 解决phpMyAdmin在nginx+php-fpm模式下无法使用的问题
- 解决phpMyAdmin在nginx+php-fpm模式下无法使用的问题