标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 19680 | Accepted: 10003 |
Description
Input
Output
Sample Input
2 2 .m H. 5 5 HH..m ..... ..... ..... mm..H 7 8 ...H.... ...H.... ...H.... mmmHmmmm ...H.... ...H.... ...H.... 0 0
Sample Output
2 10 28
Source
/** 题意:相同数目的人和房子 n个人分不同的房子,然后走的每一步1¥ 问最小的花费 做法:km(二分图最大权匹配) **/ #include <iostream> #include <cmath> #include <algorithm> #include <string.h> #include <stdio.h> using namespace std; const int maxn = 110; const int INF = 0x3f3f3f3f; int g[maxn][maxn]; int linker[maxn], lx[maxn], ly[maxn]; int stlck[maxn]; bool visx[maxn], visy[maxn]; int nx, ny; bool dfs(int x) { visx[x] = true; for(int y = 0; y < ny; y++) { if(visy[y] == true) { continue; } int tmp = lx[x] + ly[y] - g[x][y]; if(tmp == 0) { visy[y] = true; if(linker[y] == -1 || dfs(linker[y])) { linker[y] = x; return true; } } else if(stlck[y] > tmp) { stlck[y] = tmp; } } return false; } int km() { memset(linker, -1, sizeof(linker)); memset(ly, 0, sizeof(ly)); for(int i = 0; i < nx; i++) { lx[i] = -INF; for(int j = 0; j < ny; j++) { if(g[i][j] > lx[i]) { lx[i] = g[i][j]; } } } for(int x = 0; x < nx; x++) { for(int i = 0; i < ny; i++) { stlck[i] = INF; } while(true) { memset(visx, false, sizeof(visx)); memset(visy, false, sizeof(visy)); if(dfs(x)) { break; } int d = INF; for(int i = 0; i < ny; i++) if(!visy[i] && d > stlck[i]) { d = stlck[i]; } for(int i = 0; i < nx; i++) if(visx[i]) { lx[i] -= d; } for(int i = 0; i < ny; i++) { if(visy[i]) { ly[i] += d; } else { stlck[i] -= d; } } } } int res = 0; for(int i = 0; i < ny; i++) { if(linker[i] != -1) { res += g[linker[i]][i]; } } return res; } char ch[maxn]; struct Node { int x; int y; Node() {} Node(int _x, int _y) { x = _x; y = _y; } } node_m[maxn], node_h[maxn]; int dist(Node a, Node b) { return abs(a.x - b.x) + abs(a.y - b.y); } int main() { int n, m; while(~scanf("%d %d", &n, &m)) { if(n == 0 && m == 0) { break; } nx = 0; ny = 0; for(int i = 0; i < n; i++) { scanf("%s", ch); for(int j = 0; j < m; j++) { if(ch[j] == ‘m‘) { node_m[nx].x = i; node_m[nx].y = j; nx++; } else if(ch[j] == ‘H‘) { node_h[ny].x = i; node_h[ny].y = j; ny++; } } } memset(g, 0, sizeof(g)); for(int i = 0; i < nx; i++) { for(int j = 0; j < ny; j++) { g[i][j] = -1 * dist(node_m[i], node_h[j]); } } int res = km(); printf("%d\n", abs(res)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4735116.html