HDU 3026 Chinese Chess 二分匹配(TLE...)
2016-07-13 09:34
295 查看
求有多少个点,满足不选这个点最大匹配减少,超时了,挖个坑, 以后实力够了在来填坑。。。
#include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn = 10010; const int maxm = 10010; bool vis[maxn]; int y[maxn]; int n, m; vector<int> G[maxn]; int b[maxn]; int nowx, nowy, flag; bool dfs(int u) { for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(vis[v] || (flag && u == nowx && v == nowy)) continue; vis[v] = true; if(y[v] == -1 || dfs(y[v])) { y[v] = u; return true; } } return false; } int match() { int ans = 0; memset(y, -1, sizeof(y)); for(int i = 0; i < n; i++) { memset(vis, false, sizeof(vis)); if(dfs(i)) ans++; } return ans; } int main() { int cas = 1; int T; int k; //scanf("%d", &T); while(scanf("%d %d %d", &n, &m, &k) != EOF) { flag = 0; for(int i = 0; i <= n; i++) G[i].clear(); memset(b, 0, sizeof(b)); while(k--) { int u, v; scanf("%d %d", &u, &v); u--; v--; G[u].push_back(v); } int ans = match(); int sum = 0; memset(b, 0, sizeof(b)); for(int j = 0; j < m; j++) if(y[j] != -1) b[y[j]] = 1; flag = 1; for(int i = 0; i < m; i++) { if(y[i] == -1) continue; int temp = y[i]; y[i] = -1; nowx = temp; nowy = i; b[temp] = 0; int flag2 = 0; for(int j = 0; j < n; j++) { memset(vis, 0, sizeof(vis)); if(!b[j] && dfs(j)) flag2 = 1; if(flag2) break; } if(!flag2) { sum++; y[i] = temp; } } printf("Board %d have %d important blanks for %d chessmen.\n", cas++, sum, ans); } return 0; }
相关文章推荐
- PostgreSQL WIN7下压缩版安装
- HDU 5446 Unknown Treasure Lucas定理+中国剩余定理
- plsql查询数据显示为乱码解决方法
- springmvc+mybatis+pgsql+jetbrick整合
- HDU 5442 Favorite Donut 最大表示法+KMP
- Shiro配置
- Missing artifact log4j:log4j:bundle:1.2.17
- POJ 1904 King's Quest 强连通分量+二分匹配
- linux-SSH远程服务的管理操作,查看虚拟机信息
- Bzoj3509:[CodeChef] COUNTARI:分块+FFT
- POJ 2486 Apple Tree 树形DP
- Android Hook框架Xposed原理与源代码分析
- Vim C/C++自动提示插件
- 网络流模板 Dinic+ISAP
- CodeForces 526B Om Nom and Dark Park
- 算法01之归并排序及多线程测试
- 亚马逊开源 AWS 平台无服务器微框架
- 定义类的方式
- 第09章:集合
- 在leangoo里怎么创建看板,更改看板名称?