UVA 10746 Crime Wave - The Sequel
最小费用最大流 源点->警察->bank->汇点
剩下的模板就可以
#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} #define MAXN 50 #define INF 100000000 const double eps = 1e-9 ; int flow[MAXN][MAXN],cap[MAXN][MAXN]; double cost[MAXN][MAXN]; int N,M,src,tag; double c; int ans; void read() { memset(cap,0,sizeof(cap)); memset(flow,0,sizeof(flow)); for (int i = 0; i < MAXN; i++) for (int j = 0; j < MAXN; j++) cost[i][j] = INF; src = 0 ; tag = N + M + 1; for (int i = 1; i <= M; i++) {cap[0][i] = 1; cost[0][i] = 0;} for (int i = 1; i <= N; i++) {cap[M + i][tag] = 1; cost[M + i][tag] = 0;} for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++) { double tmp; scanf("%lf",&tmp); cost[j][i + M] = tmp; cost[i + M][j] = -tmp; cap[j][i + M] = 1; } } void slove() { queue<int>q; bool inq[MAXN]; int p[MAXN]; double d[MAXN]; ans = 0; c = 0.0; while (true) { memset(inq,false,sizeof(inq)); for (int i = 0; i < MAXN; i ++) d[i] = INF; d[src] = 0; q.push(src); while (!q.empty()) { int u = q.front(); q.pop(); inq[u] = false; for (int v = 0 ; v <= tag; v++) if (cap[u][v] > flow[u][v] && d[v] > d[u] + cost[u][v] + eps) { d[v] = d[u] + cost[u][v]; p[v] = u; if (!inq[v]) { inq[v] = true; q.push(v); } } } if (d[tag] == INF) break; int a = INF; for (int u = tag; u != src; u = p[u]) a = min(a,cap[p[u]][u] - flow[p[u]][u]); for (int u = tag; u != src; u = p[u]) { flow[p[u]][u] += a; flow[u][p[u]] -= a; } c += d[tag] * a; ans += a; } } int main() { //freopen("sample.txt","r",stdin); //freopen("output.txt","w",stdin); while (scanf("%d%d",&N,&M) != EOF) { if (N == 0 && M == 0) break; read(); slove(); printf("%.2lf\n",c / N + eps); } return 0; }
今年输的,明年全都要赢回来