hdu4310 java解法
时间: 2023-11-20 20:55:20 浏览: 109
以下是hdu4310的Java解法:
```java
import java.util.*;
import java.io.*;
public class Main {
static int MAXN = 100010;
static int MAXM = 200010;
static int INF = 0x3f3f3f3f;
static int n, m, s, t, cnt;
static int[] head = new int[MAXN];
static int[] dis = new int[MAXN];
static boolean[] vis = new boolean[MAXN];
static int[] pre = new int[MAXN];
static int[] cur = new int[MAXN];
static class Edge {
int to, next, cap, flow, cost;
public Edge(int to, int next, int cap, int flow, int cost) {
this.to = to;
this.next = next;
this.cap = cap;
this.flow = flow;
this.cost = cost;
}
}
static Edge[] edge = new Edge[MAXM];
static void addEdge(int u, int v, int cap, int flow, int cost) {
edge[cnt] = new Edge(v, head[u], cap, flow, cost);
head[u] = cnt++; edge[cnt] = new Edge(u, head[v], 0, 0, -cost);
head[v] = cnt++;
}
static boolean spfa() {
Arrays.fill(dis, INF);
Arrays.fill(vis, false);
Queue<Integer> q = new LinkedList<>();
q.offer(s);
dis[s] = 0;
vis[s] = true;
while (!q.isEmpty()) {
int u = q.poll();
vis[u] = false;
for (int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].to;
if (edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost) {
dis[v] = dis[u] + edge[i].cost;
pre[v] = u;
cur[v] = i;
if (!vis[v]) {
vis[v] = true;
q.offer(v);
}
}
}
}
return dis[t] != INF;
}
static int[] MCMF(int s, int t) {
int flow = 0, cost = 0;
while (spfa()) {
int f = INF;
for (int u = t; u != s; u = pre[u]) {
f = Math.min(f, edge[cur[u]].cap - edge[cur[u]].flow);
}
for (int u = t; u != s; u = pre[u]) {
edge[cur[u]].flow += f;
edge[cur[u] ^ 1].flow -= f;
cost += edge[cur[u]].cost * f;
}
flow += f;
}
return new int[]{flow, cost};
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
int T = in.nextInt();
for (int cas = 1; cas <= T; cas++) {
n = in.nextInt();
m = in.nextInt();
s = 0;
t = n + m + 1;
cnt = 0;
Arrays.fill(head, -1);
for (int i = 1; i <= n; i++) {
int c = in.nextInt();
addEdge(s, i, c, 0, 0);
}
for (int i = 1; i <= m; i++) {
int c = in.nextInt();
addEdge(i + n, t, c, 0, 0);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
int c = in.nextInt();
addEdge(i, j + n, INF, 0, c);
}
}
int[] ans = MCMF(s, t);
System.out.printf("Case #%d: %d\n", cas, ans[1]);
}
}
}
```
阅读全文