hdoj 1045 Fire Net (dfs or 匈牙利)
来源:互联网 发布:淘宝上的电动车靠谱吗 编辑:程序博客网 时间:2024/06/06 12:45
题意:
给出一个图,其中有 . 和 X 两种,. 为通路,X表示墙,在.中放炸弹,然后炸弹不能穿过墙且不能互相炸到,问你最多在图中可以放多少个炸弹?
思路:
因为数据很弱,所以搜索也可以过。还有个更好的方法,二分图最大匹配。
难在建图,把每一行中的可以放一个炸弹的一块区域标记为同一个数字,列也一样。
这样每个点就有一个行标记值和列标记值,然后按照这两个数字进行二分匹配。最大匹配即为最多能放的炸弹数目。
最大匹配代码:
#include<bits/stdc++.h>using namespace std;const int maxn = 55;vector<int> e[maxn];int n, rowNum, colNum, row[maxn][maxn], col[maxn][maxn], match[maxn], vis[maxn];char pic[maxn][maxn];bool Hungary(int x){ for(int i = 0; i < e[x].size(); i++) { int to = e[x][i]; if(!vis[to]) { vis[to] = 1; if(!match[to] || Hungary(match[to])) { match[to] = x; return true; } } } return false;}int main(void){ while(cin >> n, n) { memset(row, 0, sizeof(row)); memset(col, 0, sizeof(col)); memset(match, 0, sizeof(match)); for(int i = 0; i < maxn; i++) e[i].clear(); for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) scanf(" %c", &pic[i][j]); // rowNum = 1, colNum = 1; for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) { if(pic[i][j] == '.' && !row[i][j]) { for(int k = j; k < n && pic[i][k] == '.'; k++) row[i][k] = rowNum; rowNum++; } if(pic[i][j] == '.' && !col[i][j]) { for(int k = i; k < n && pic[k][j] == '.'; k++) col[k][j] = colNum; colNum++; } } //每个点的行标记值和列标记值构成关系 for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) if(pic[i][j] == '.') e[row[i][j]].push_back(col[i][j]); int ans = 0; for(int i = 1; i < rowNum; i++) { memset(vis, 0, sizeof(vis)); if(Hungary(i)) ans++; } printf("%d\n", ans); } return 0;}
搜索代码:
#include<iostream>#include<cstdio>using namespace std;const int maxn = 10;char pic[maxn][maxn];int n, ans;bool judge(int x, int y){ if(pic[x][y] != '.') return false; for(int i = y-1; i >= 0; i--) { if(pic[x][i] == 'X') break; if(pic[x][i] == 0) return false; } for(int i = x-1; i >= 0; i--) { if(pic[i][y] == 'X') break; if(pic[i][y] == 0) return false; } return true;}void dfs(int x, int y, int num){ if(x == n) { ans = max(ans, num); return ;} if(y == n) { dfs(x+1, 0, num); return ;} for(int i = y; i < n; i++) if(judge(x, i)) { pic[x][i] = 0; dfs(x, i+1, num+1); pic[x][i] = '.'; } dfs(x+1, 0, num);}int main(void){ while(cin >> n, n) { for(int i = 0; i < n; i++) scanf(" %s", pic[i]); ans = 0; dfs(0, 0, 0); printf("%d\n", ans); } return 0;}
0 0
- hdoj 1045 Fire Net (dfs or 匈牙利)
- hdoj 1045 Fire Net 【DFS】
- 【HDOJ 1045】Fire Net--dfs
- hdoj 1045 Fire Net(DFS)
- hdoj 1045 Fire Net 【dfs】
- hdoj 1045 Fire Net (dfs)
- HDOJ 题目1045 Fire Net(dfs)
- HDOJ Fire Net 1045【DFS+回溯】
- HDOJ 1045 Fire Net(DFS)
- hdoj 1045 Fire Net(dfs)
- HDOJ(HDU).1045 Fire Net (DFS)
- hdoj 1045 Fire Net 【DFS n皇后变形】 【二分图】
- ACM--DFS--最大碉堡数--HDOJ 1045--Fire Net
- HDOJ 1045 Fire Net
- HDOJ 1045 Fire Net
- hdoj 1045 Fire Net
- HDOJ 1045 Fire Net
- hdoj-1045-Fire Net
- MySQL函数
- java笔记之重载与覆盖
- link js重构心得
- 【思考】毕业季的纠结与思考
- 一箭多雕
- hdoj 1045 Fire Net (dfs or 匈牙利)
- Day 17 Hibernate
- 总结的堆和gc算法的网站
- 我的理解-android的事件分发
- hdu4496 D-City 判断两元素是否在同一集合
- 机器学习(一):KNN算法
- 文章标题
- JAVA基础知识面试题集
- TreeDp POJ2342 Anniversary party