HDU1054 Strategic Game(二分匹配)
2016-05-17 11:46
309 查看
题意:
给你一个图,然后每个点被覆盖的时候,相邻的点也会被覆盖
求最小的数量使所有点被覆盖
思路:
学树形dp的时候做过这道题了,绝对比二分图快。。
现在刷二分图,n=1500,用匈牙利和HK算了下
先上匈牙利。。624ms
然后是我的大HK- -,327ms
给你一个图,然后每个点被覆盖的时候,相邻的点也会被覆盖
求最小的数量使所有点被覆盖
思路:
学树形dp的时候做过这道题了,绝对比二分图快。。
现在刷二分图,n=1500,用匈牙利和HK算了下
先上匈牙利。。624ms
/* *********************************************** Author :devil Created Time :2016/5/17 11:42:42 ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <stdlib.h> using namespace std; const int N=1510; int link ; bool vis ; vector<int>eg ; bool dfs(int u) { for(int i=0;i<eg[u].size();i++) { int v=eg[u][i]; if(!vis[v]) { vis[v]=1; if(link[v]==-1||dfs(link[v])) { link[v]=u; return 1; } } } return 0; } int main() { //freopen("in.txt","r",stdin); int n,x,y,k; while(~scanf("%d",&n)) { memset(link,-1,sizeof(link)); for(int i=0;i<n;i++) eg[i].clear(); for(int i=0;i<n;i++) { scanf("%d:(%d)",&x,&k); while(k--) { scanf("%d",&y); eg[x].push_back(y); eg[y].push_back(x); } } int ans=0; for(int i=0;i<n;i++) { memset(vis,0,sizeof(vis)); ans+=dfs(i); } printf("%d\n",ans/2); } return 0; }
然后是我的大HK- -,327ms
/* *********************************************** Author :devil Created Time :2016/5/17 11:46:38 ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <stdlib.h> using namespace std; const int N=1510; const int inf=0x3f3f3f3f; vector<int>eg ; int n; int mx ,my ; int dx ,dy ,dis; bool vis ; bool bfs() { queue<int>q; dis=inf; memset(dx,-1,sizeof(dx)); memset(dy,-1,sizeof(dy)); for(int i=0;i<n;i++) if(mx[i]==-1) { q.push(i); dx[i]=0; } while(!q.empty()) { int u=q.front(); q.pop(); if(dx[u]>dis) break; for(int i=0;i<eg[u].size();i++) { int v=eg[u][i]; if(dy[v]==-1) { dy[v]=dx[u]+1; if(my[v]==-1) dis=dy[v]; else { dx[my[v]]=dy[v]+1; q.push(my[v]); } } } } return dis!=inf; } bool dfs(int u) { for(int i=0;i<eg[u].size();i++) { int v=eg[u][i]; if(!vis[v]&&dy[v]==dx[u]+1) { vis[v]=1; if(my[v]!=-1&&dy[v]==dis) continue; if(my[v]==-1||dfs(my[v])) { my[v]=u; mx[u]=v; return 1; } } } return 0; } int MaxMatch() { int ans=0; memset(mx,-1,sizeof(mx)); memset(my,-1,sizeof(my)); while(bfs()) { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) if(mx[i]==-1&&dfs(i)) ans++; } return ans; } int main() { //freopen("in.txt","r",stdin); int x,y,k; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) eg[i].clear(); for(int i=0;i<n;i++) { scanf("%d:(%d)",&x,&k); while(k--) { scanf("%d",&y); eg[x].push_back(y); eg[y].push_back(x); } } printf("%d\n",MaxMatch()/2); } return 0; }
相关文章推荐
- C#清除WebBrowser中Cookie缓存的方法
- 获取SHA1值
- Xamarin.Forms之PCLStorage
- callback to handle completion of pipe
- 解决linux不能上外网的问题
- The Three Most Important Things You Look for in Your Employment Relationship
- 2016 UESTC Training for Dynamic Programming D - 柱爷的恋爱 区间dp、记忆化搜索
- 2016 UESTC Training for Dynamic Programming C - 柱爷的下凡 预处理打表、背包问题
- tb740605_2012
- 软件开发过程-Python集成开发环境
- 在ASP.NET 2.0中操作数据之五十八:在程序启动阶段缓存数据
- 04-时序逻辑电路设计之计数器——小梅哥FPGA设计思想与验证方法视频教程配套文档
- polymer 1.0 dom-repeat filter only runs once
- 真实大起底:一名黑马程序员的就业经历
- CentOS 7 (无盘安装)PXE服务器的搭建(失败求助版)
- H5元素以及属性
- js 通过userAgent判断是安卓还是ios
- List<?> list= new ArrayList<?>为什么这样写 接口引用指向实现类的对象
- 2016 UESTC Training for Dynamic Programming B - 柱爷与最大区间和 最大区间和推广、前缀和、枚举间隔点
- 2016 UESTC Training for Dynamic Programming A - 柱爷与咸鱼神功 0-1背包