hdu1045 Fire Net
2012-12-22 19:41
190 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1045
二分图匹配,匈牙利算法(dfs+邻接矩阵),König定理
需要自己建新图
以前用搜索做过~ 感觉建图好神奇
二分图匹配,匈牙利算法(dfs+邻接矩阵),König定理
需要自己建新图
以前用搜索做过~ 感觉建图好神奇
#include <stdio.h> #include <string.h> #define N 10 int n, m; int map0 , map1 , map2 ; int map , girl , flag ; int find(int x) { int i; for(i=1; i<=m; i++) { if(!flag[i] && map[x][i]) { flag[i] = 1; if(girl[i]==-1 || find(girl[i])) { girl[i] = x; return 1; } } } return 0; } int main() { int n0, i, j, sum, count; char c; while(scanf("%d%*c", &n0), n0) { //初始化 memset(map, 0, sizeof(map)); memset(girl, -1, sizeof(girl)); for(i=1; i<=n0; i++) { map0[i][0] = map0[0][i] = 1; for(j=1; j<=n0; j++) { scanf("%c", &c); map0[i][j] = c-'.'; } getchar(); } //给每个点编一个新行号 count = 0; for(i=1; i<=n0; i++) { for(j=1; j<=n0; j++) { if(map0[i][j-1] && (!map0[i][j])) { count ++; } map1[i][j] = count; } } n = count; //给每个点编一个新列号 count = 0; for(j=1; j<=n0; j++) { for(i=1; i<=n0; i++) { if(map0[i-1][j] && (!map0[i][j])) { count ++; } map2[i][j] = count; } } m = count; //根据新的行列号,建图 for(i=1; i<=n0; i++) { for(j=1; j<=n0; j++) { if(!map0[i][j]) { map[map1[i][j]] [map2[i][j]] = 1; } } } //匈牙利算法 sum = 0; for(i=1; i<=n; i++) { memset(flag, 0, sizeof(flag)); sum += find(i); } printf("%d\n", sum); } return 0; }
相关文章推荐
- 二分匹配-hdu-1045-Fire Net
- HDU1045 Fire Net(深搜DFS)
- hdu 1045 Fire Net(dfs)
- hdu 1045 Fire Net (dfs)
- hdu-1045 Fire Net(DFS)
- 【DFS 回溯】HDU 1045 Fire Net
- HDU 1045 Fire Net 最大二分图匹配
- hdu 1045 && zoj 1002 Fire Net(DFS && 二分图匹配)
- HDU 1045(Fire Net)题解
- hdu 1045 Fire Net(dfs)
- hdu 1045 Fire Net(贪心)
- HDU - 1045 Fire Net (二分匹配)
- HDU - 1045 - Fire Net (DFS)
- HDU1045 - Fire Net (深搜)
- hdu 1045 Fire Net (DFS java)
- hdu 1045 Fire Net(二分匹配 or 暴搜)
- HDU-1045-Fire Net
- HDU 1045 Fire Net
- HDU 1045 Fire Net (DFS)
- HDU 1045 Fire Net(DFS)