Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
费用流水过(937ms)#include<cstdio> #include<climits> #include<queue> #include<cstring> #include<cmath> using namespace std; #define ll long long const int MAX_V = 202; struct edge { int to, cap, cost, rev; edge (int t, int ca, int c, int r): to(t), cap(ca), cost(c), rev(r){} }; vector<edge> G[MAX_V]; int h[MAX_V], dist[MAX_V], V, prevv[MAX_V], preve[MAX_V], P[101], Q[101], B[101], X[101], Y[101], C[101]; typedef pair<int, int> Pa; inline void add_edge(int from, int to, int cap, int cost) { G[from].push_back(edge(to, cap, cost, G[to].size())); G[to].push_back(edge(from, 0, -cost, G[from].size() - 1)); } int min_cost_flow(int s, int t, int f) { int res = 0; priority_queue<Pa, vector<Pa>, greater<Pa> > que; while (f > 0) { fill(dist, dist + V + 1, INT_MAX); dist[s] = 0; que.push(Pa(0, s)); for (int v, dis; !que.empty(); ) { v = que.top().second, dis = que.top().first; que.pop(); if (dis > dist[v]) continue; for (int i = 0; i < G[v].size(); ++i) { edge& e = G[v][i]; if (e.cap > 0 && dist[e.to] > dis + e.cost + h[v] - h[e.to]) { dist[e.to] = dis + e.cost + h[v] - h[e.to], prevv[e.to] = v, preve[e.to] = i; que.push(Pa(dist[e.to], e.to)); } } } if (dist[t] == INT_MAX) return -1; for (int v = 0; v <= V; ++v) h[v] += dist[v]; int d = f; for (int v = t; v != s; v = prevv[v]) d = min(d, G[prevv[v]][preve[v]].cap); f -= d, res += h[t] * d; for (int v = t; v != s; v = prevv[v]) { edge& e = G[prevv[v]][preve[v]]; e.cap -= d, G[v][e.rev].cap += d; } } return res; } int main() { int n, m, s = 0, t, cost = 0, f = 0; scanf("%d%d", &n, &m); t = n + m + 1, V = t; for (int i = 1; i <= n; ++i) scanf("%d%d%d", &X[i], &Y[i], &B[i]); for (int i = 1; i <= m; ++i) scanf("%d%d%d", &P[i], &Q[i], &C[i]); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { int e, c = abs(X[i] - P[j]) + abs(Y[i] - Q[j]) + 1; scanf("%d", &e); add_edge(i, n + j, INT_MAX, c); cost += e * c; } } for (int i = 1; i <= n; ++i) { add_edge(s, i, B[i], 0); f += B[i]; } for (int i = 1; i <= m; ++i) { add_edge(n + i, t, C[i], 0); } if (min_cost_flow(s, t, f) < cost) { puts("SUBOPTIMAL"); for (int i = 0; i < n; ++i) for (int j = 1; j <= m; ++j) printf("%d%c", G[n + j][i].cap, j == m ? '\n' : ' '); } else puts("OPTIMAL"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator